LINUX.ORG.RU

gcc test.c -o test
test.c:9: error: syntax error before '&' token
test.c: In function 'add':
test.c:10: error: 'head' undeclared (first use in this function)
test.c:10: error: (Each undeclared identifier is reported only once
test.c:10: error: for each function it appears in.)
test.c:12: error: 'data' undeclared (first use in this function)
test.c: In function 'main':
test.c:22: error: 'for' loop initial declaration used outside C99 mode

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

Ага, значит я не шизик :)

Теперь осталось разобратся, почему не работает то, что должно... Например, что такое "C99 mode"? И почему не работает комбинация "t_mystruct *&head"?

shuthdar ★★★
() автор топика

если ты не указал язык (си или плюсы) опциями, то он определяет язык по суффиксу имени файла. У тебя .c а ты пишешь на плюсах.

dilmah ★★★★★
()
Ответ на: комментарий от shuthdar

С99 mode это такое соглашение о синтаксисе : man gcc. + google.com

А ты сам представляешь чем различаются строки :

t_mystruct *&head

и

t_mystruct *head ?

П.С. : коды программа отработала принято возвращать 0 (почитай bash-программинг на эту тему) -> return 0;

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

>А ты сам представляешь чем различаются строки :

Как я понимаю - "t_mystruct *head" передаёт значение адреса переменной, а "t_mystruct *&head" - переменную, содержащую этот адрес. Так?

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

"...С99 mode" ругань была на организацию цикла :
int i;
for ( i = 0 ; i < 5 ; i++ )

fura13 ★★★
()
Ответ на: комментарий от shuthdar

> Тогда вопрос - а как сделать аналог С++-ного *& на pure c?

либо макрос. Как раз для таких низкоуровневых операций со структурами данных -- нормалдьное решение. либо **

dilmah ★★★★★
()
Ответ на: комментарий от shuthdar

> Как я понимаю - "t_mystruct *head" передаёт значение адреса
> переменной, а "t_mystruct *&head" - переменную, содержащую этот
> адрес. Так?

В чистом C нет ссылок, только указатели. Так что придется тебе
передавать t_mystruct**, и при вызове явно делать &.

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

С ** никак не получилось, может потому что Си плохо знаю. Сделал иначе, через ж*пу, но работает - функция просто возвращает значение созданной структуры, и при вызове делается head = add(head, data);

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

void add(t_mystruct **head, int data) {
	if(!(*head)) {
		*head = malloc(sizeof(t_mystruct));
		(*head)->data = data;
	}
	else
		add((*head)->next, data);
}

int main()
{
	t_mystruct *head = NULL;

	for(int i = 0; i < 5; i++) {
		add(&head, i + 1);
	}

	t_mystruct *tmp = head;
	while(tmp) {
		printf("%i\n", tmp->data);
		tmp = tmp->next;
	}
	return 1;
}

Если не напутал с синтаксисом...

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

>С ** никак не получилось, может потому что Си плохо знаю.

Блин, не вспомню пример библиотечной функции, куда передаётся **. Подскажите человеку, какой ман лучше почитать?

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

Нашёл. man iconv посмотри. А ещё лучше хорошо представлять, что есть указатель, что есть &a и что есть *a.

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

Суфикс имеет более высокий приоритет, чем префикс.

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