LINUX.ORG.RU

не компилится код


0

0

потихоньку учу С. некомпилируется следующий код:

#include<stdio.h>
#include<stdlib.h>

typedef struct Abit Abit;
int initilize_base(Abit * abit);

struct Abit{
	char name[10];
	char facult[10];
	Abit * next;
};

int main(void)
{
	Abit * abit;
	
	initialize_base(abit);
	sprintf(abit->name,"olo");
	sprintf(abit->facult,"olo");
	
	printf("Name: > %s\nFacultet: > %s\n",abit->name, abit->facult);
	
	return 0;
}

void initilize_base(Abit * abit)
{
	abit = (Abit *)malloc(sizeof(Abit));
	abit->next = NULL;
}
при компиляции выдает следующее:
$ gcc -o lol lol.c
/tmp/ccQEwYB3.o: In function `main':
lol.c:(.text+0x11): undefined reference to `initialize_base'
collect2: ld returned 1 exit status
что поправить в коде, чтобы все заработало?



Последнее исправление: s0ul (всего исправлений: 1)

и да - русский и английский тоже учи понемногу

lester ★★★★
()

Убрать а: initiAAAAAlize_base(abit); и начать писать «не» с глаголами раздельно.

anonymous
()

Еще надо ставить -Wall в параметре компилятора, чтобы сразу выявлять такое ещё в процессе компиляции.

anonymous
()
Ответ на: комментарий от anonymous

спасибо. уже не вижу ничего. надо идти спать..

заменить int на void

это имеет значение? просто в институте стоят msvc. вот он ругается если ставить void, поэтому так и ставлю.

s0ul
() автор топика
Ответ на: комментарий от lester

да я уже поменял немного код.

#include<stdio.h>
#include<stdlib.h>

typedef struct Abit Abit;

struct Abit{
	char name[10];
	char facult[10];
	Abit * next;
};

void initialize_base(Abit * abit)
{
	abit = (Abit *)malloc(sizeof(Abit));
	abit->next = NULL;
}

int main(void)
{
	Abit * abit;
	
	initialize_base(abit);
	
	sprintf(abit->name,"olo");
	sprintf(abit->facult,"olo");
	
	printf("Name: > %s\nFacultet: > %s\n",abit->name, abit->facult);
	
	return 0;
}
теперь ругается на следующее
$ gcc -Wall -o lol lol.c && ./lol
lol.c: In function ‘main’:
lol.c:22: warning: ‘abit’ is used uninitialized in this function
Ошибка сегментирования
при чем если вместо вызова initialize_base поставить
abit = (Abit *)malloc(sizeof(Abit))
то все отлично работает

s0ul
() автор топика
Ответ на: комментарий от lester

черт. вроде работает. сделал так:

...

Abit * initialize_base(Abit * abit)
{
	abit = (Abit *)malloc(sizeof(Abit));
	abit->next = NULL;
	return abit;
}

...

	abit = initialize_base(abit);

...
или вы имели ввиду что-то другое?

s0ul
() автор топика
Ответ на: комментарий от s0ul
... 
 
Abit * initialize_base() 
{ 
   Abit * abit;

   abit = (Abit *)malloc(sizeof(Abit)); 
   abit->next = NULL; 
   return abit; 
} 
 
... 
 
   abit = initialize_base(); 
 
... 

все теперь и ворнингов нету

s0ul
() автор топика
Ответ на: комментарий от s0ul

Ну нельзя же так. Нужно хотя бы осилить классику жанра

Брайан Керниган, Деннис Ритчи

Язык программирования C

anonymous
()
Ответ на: комментарий от s0ul
5.2 Указатели и аргументы функций

Поскольку в Си функции в качестве своих аргументов получают значения параметров, нет прямой возможности, находясь в вызванной функции, изменить переменную вызывающей функции. В программе сортировки нам понадобилась функция swap, меняющая местами два неупорядоченных элемента. Однако недостаточно написать

swap(a, b);

где функция swap определена следующим образом:

void swap(int х, int у) /* НЕВЕРНО */
{
    int temp;
    temp = х;
    x = y;
    у = temp;
}

Поскольку swap получает лишь копии переменных a и b, она не может повлиять на переменные a и b той программы, которая к ней обратилась. Чтобы получить желаемый эффект, вызывающей программе надо передать указатели на те значения, которые должны быть изменены:

swap(&a, &b);

Так как оператор & получает адрес переменной, &a есть указатель на a. В самой же функции swap параметры должны быть объявлены как указатели, при этом доступ к значениям параметров будет осуществляться косвенно.

void swap(int *px, int *py) /* перестановка *px и *py */
{
    int temp;
    temp = *рх;
    *рх = *py;
    *ру = temp;
}
anonymous
()
Ответ на: комментарий от s0ul

А где проверка на успешность выделения памяти?

anonymous
()
Ответ на: комментарий от s0ul

Приличные люди еще память за собой освобождают.

anonymous
()
Ответ на: комментарий от anonymous

> Ну нельзя же так. Нужно хотя бы осилить классику жанра

Действительно студенты нынче совсем никакие пошли. А что это они в последнии несколько дней с вопросами по C/C++ активизировались? Сессия вроде бы прошла...

anonymous
()
Ответ на: комментарий от anonymous

Да не нужно и классики - ему же компилятор ясно и доступно рассказал, в чем он не прав.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.