Struktury C++ nie kompilują się w C

0

Witam,

na wstępie zaznaczę, że jestem lajkiem, a więc robiłem program, który mam jako zadanie, siedziałem z książką nad nim pełno czasu, jednak w Visual Studio zaznaczyłem precompiled header zamiast empty project. Tak zrobiony program działa, aczkolwiek jak stwierdziono jest w jezyku c++, jak go teraz przerobić? Gdy zaznaczam tym razem empty project i robie rozszerzenie .c wyskakuje masa błędów.

Oto program:

/*Zadanie 14 - odwraca kolejność łańcuchu*/
#define _CRT_SECURE_NO_WARNINGS
#define MAXLENGTH 1000
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct Element 
{ 
	char *Text; 
	struct Element *next; 
};

int main() 
{
	Element *stack = NULL; 
	char buf[MAXLENGTH];    

	for(;;) 
	{
		if(fgets(buf, (int)sizeof(buf), stdin)==NULL) 
		{
			
			break;
			
		}
		

		if(buf[0] == '\n')
			
		{
			
			break;
			
		}
		
		struct Element *temp = (Element*)malloc(sizeof(struct Element));
		temp->Text = (char*)malloc(MAXLENGTH);
		strcpy(temp->Text, buf);  
		temp->next = stack;
		stack = temp;

		
		
	}

	while(stack != NULL)
	{
		printf("%s", stack->Text);

		struct Element *temp = stack->next;

		free(stack->Text);
		free(stack);

		stack = temp;
		
	}

	system("PAUSE");

	return 0;
}

a Oto błędy:

1>  Zadanie14.c
1>c:\users\conte\documents\visual studio 2010\projects\zadanie14\zadanie14.c(16): error C2065: 'Element' : undeclared identifier
1>c:\users\conte\documents\visual studio 2010\projects\zadanie14\zadanie14.c(16): error C2065: 'stack' : undeclared identifier
1>c:\users\conte\documents\visual studio 2010\projects\zadanie14\zadanie14.c(16): warning C4047: '=' : 'int' differs in levels of indirection from 'void *'
1>c:\users\conte\documents\visual studio 2010\projects\zadanie14\zadanie14.c(16): error C2106: '=' : left operand must be l-value
1>c:\users\conte\documents\visual studio 2010\projects\zadanie14\zadanie14.c(17): error C2143: syntax error : missing ';' before 'type'
1>c:\users\conte\documents\visual studio 2010\projects\zadanie14\zadanie14.c(21): error C2065: 'buf' : undeclared identifier
1>c:\users\conte\documents\visual studio 2010\projects\zadanie14\zadanie14.c(21): warning C4047: 'function' : 'char *' differs in levels of indirection from 'int'
1>c:\users\conte\documents\visual studio 2010\projects\zadanie14\zadanie14.c(21): warning C4024: 'fgets' : different types for formal and actual parameter 1
1>c:\users\conte\documents\visual studio 2010\projects\zadanie14\zadanie14.c(21): error C2065: 'buf' : undeclared identifier
1>c:\users\conte\documents\visual studio 2010\projects\zadanie14\zadanie14.c(29): error C2065: 'buf' : undeclared identifier
1>c:\users\conte\documents\visual studio 2010\projects\zadanie14\zadanie14.c(29): error C2109: subscript requires array or pointer type
1>c:\users\conte\documents\visual studio 2010\projects\zadanie14\zadanie14.c(37): error C2143: syntax error : missing ';' before 'type'
1>c:\users\conte\documents\visual studio 2010\projects\zadanie14\zadanie14.c(38): error C2065: 'temp' : undeclared identifier
1>c:\users\conte\documents\visual studio 2010\projects\zadanie14\zadanie14.c(38): error C2223: left of '->Text' must point to struct/union
1>c:\users\conte\documents\visual studio 2010\projects\zadanie14\zadanie14.c(39): error C2065: 'temp' : undeclared identifier
1>c:\users\conte\documents\visual studio 2010\projects\zadanie14\zadanie14.c(39): error C2223: left of '->Text' must point to struct/union
1>c:\users\conte\documents\visual studio 2010\projects\zadanie14\zadanie14.c(39): error C2065: 'buf' : undeclared identifier
1>c:\users\conte\documents\visual studio 2010\projects\zadanie14\zadanie14.c(39): warning C4047: 'function' : 'char *' differs in levels of indirection from 'int'
1>c:\users\conte\documents\visual studio 2010\projects\zadanie14\zadanie14.c(39): warning C4024: 'strcpy' : different types for formal and actual parameter 1
1>c:\users\conte\documents\visual studio 2010\projects\zadanie14\zadanie14.c(39): error C2198: 'strcpy' : too few arguments for call
1>c:\users\conte\documents\visual studio 2010\projects\zadanie14\zadanie14.c(40): error C2065: 'temp' : undeclared identifier
1>c:\users\conte\documents\visual studio 2010\projects\zadanie14\zadanie14.c(40): error C2223: left of '->next' must point to struct/union
1>c:\users\conte\documents\visual studio 2010\projects\zadanie14\zadanie14.c(40): error C2065: 'stack' : undeclared identifier
1>c:\users\conte\documents\visual studio 2010\projects\zadanie14\zadanie14.c(41): error C2065: 'stack' : undeclared identifier
1>c:\users\conte\documents\visual studio 2010\projects\zadanie14\zadanie14.c(41): error C2065: 'temp' : undeclared identifier
1>c:\users\conte\documents\visual studio 2010\projects\zadanie14\zadanie14.c(47): error C2065: 'stack' : undeclared identifier
1>c:\users\conte\documents\visual studio 2010\projects\zadanie14\zadanie14.c(47): warning C4047: '!=' : 'int' differs in levels of indirection from 'void *'
1>c:\users\conte\documents\visual studio 2010\projects\zadanie14\zadanie14.c(49): error C2065: 'stack' : undeclared identifier
1>c:\users\conte\documents\visual studio 2010\projects\zadanie14\zadanie14.c(49): error C2223: left of '->Text' must point to struct/union
1>c:\users\conte\documents\visual studio 2010\projects\zadanie14\zadanie14.c(51): error C2143: syntax error : missing ';' before 'type'
1>c:\users\conte\documents\visual studio 2010\projects\zadanie14\zadanie14.c(53): error C2065: 'stack' : undeclared identifier
1>c:\users\conte\documents\visual studio 2010\projects\zadanie14\zadanie14.c(53): error C2223: left of '->Text' must point to struct/union
1>c:\users\conte\documents\visual studio 2010\projects\zadanie14\zadanie14.c(53): error C2198: 'free' : too few arguments for call
1>c:\users\conte\documents\visual studio 2010\projects\zadanie14\zadanie14.c(54): error C2065: 'stack' : undeclared identifier
1>c:\users\conte\documents\visual studio 2010\projects\zadanie14\zadanie14.c(54): warning C4022: 'free' : pointer mismatch for actual parameter 1
1>c:\users\conte\documents\visual studio 2010\projects\zadanie14\zadanie14.c(56): error C2065: 'stack' : undeclared identifier
1>c:\users\conte\documents\visual studio 2010\projects\zadanie14\zadanie14.c(56): error C2065: 'temp' : undeclared identifier
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

Może ktoś mi powiedzieć co z tym zrobić?

3

W C musisz przy używaniu struktur pisać

struct Element zmienna;

Możesz też przy deklaracji struktury dać

typedef struct Element
0
 #define MAXLENGTH 1000
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stddef.h>

struct Element 
{ 
	char *Text; 
	struct Element *next; 
};

int main(int argc, char* argv[])
{
	struct Element *stack = NULL;
	char buf[MAXLENGTH];

	for(;;)
	{
		if(fgets(buf, (int)sizeof(buf), stdin)==NULL){
			break;
		}

		if(buf[0] == '\n')
		{
			break;
		}

		struct Element *temp = (Element*)malloc(sizeof(struct Element));
		temp->Text = (char*)malloc(MAXLENGTH);
		strcpy(temp->Text, buf);
		temp->next = stack;
		stack = temp;
	}

	while(stack != NULL)
	{
		printf("%s", stack->Text);

		struct Element *temp = stack->next;

		free(stack->Text);
		free(stack);

		stack = temp;
	}

	system("PAUSE");

	return 0;
}

Czy o to chodziło? W każdym razie przesiadłem się na Dev c++, teraz gdy taki program jak powyżej chce uruchomić wyskakują mi takie błędy:

Wykonywanie gcc.exe...
gcc.exe "C:\Users\conTE\Desktop\Nowe14.c" -o "C:\Users\conTE\Desktop\Nowe14.exe" -g3 -I"D:\Program Files (x86)\Dev-Cpp\MinGW64\include" -I"D:\Program Files (x86)\Dev-Cpp\MinGW64\x86_64-w64-mingw32\include" -L"D:\Program Files (x86)\Dev-Cpp\MinGW64\lib" -L"D:\Program Files (x86)\Dev-Cpp\MinGW64\x86_64-w64-mingw32\lib" -static-libgcc -g3
C:\Users\conTE\Desktop\Nowe14.c: In function 'main':

C:\Users\conTE\Desktop\Nowe14.c27: error: 'Element' undeclared (first use in this function)
C:\Users\conTE\Desktop\Nowe14.c27: note: each undeclared identifier is reported only once for each function it appears in
C:\Users\conTE\Desktop\Nowe14.c35: error: expected expression before ')' token

Compilation failed after 0,27 seconds with errors

2

OMG. Jaka juz to zmieniasz to WSZĘDZIE. Linijka z blędem:

struct Element *temp = (Element*)malloc(sizeof(struct Element));
struct Element *temp

dobrze

(Element*)

źle

sizeof(struct Element)

dobrze

0

Nie musisz się od razu tak denerwować, żeby pisać "OMG", przeoczyłem jedno miejsce... W każdym razie wielkie dzięki. Temat można zamknąć, a najlepiej usunąć :)

1
conTEq napisał(a):

Nie musisz się od razu tak denerwować.

A jak radzisz reagować na kogoś kto prosi pomocy z błędem o treści: - zadanie14.c(16): error C2065: 'Element' : undeclared identifier
Jemu podają rozwiązanie a on prosi pomocy z błędem o treści: - Nowe14.c:29:27: error: 'Element' undeclared (first use in this function)
?

0

Mam jeszcze jedno pytanie, dlaczego Dev-c++ ten program kompiluje, natomiast visual 2010 jako .c sypie masą błędów?

1

Przypuszczalnie dlatego że nie umiesz go użyć. Niestety mam jeszcze pełny kubek herbaty więc nie mam jak wywróżyć z fusów JAKIE BŁĘDY dostajesz.

0

W Visualu robie tak File->new->project. Wybieram Win32 Console Application wpisuje nazwe. Potem next -> zaznaczam empty project ->finish. Nastepnie Source Files -> Add new item wpisuje nazwe z końcówką .c i ok. W to wklejam zadanie które kompiluje się w devie i dostaje takie kominukaty:

 1>c:\users\conte\documents\visual studio 2010\projects\zdanie\zdadsa.c(30): error C2143: syntax error : missing ';' before 'type'
1>c:\users\conte\documents\visual studio 2010\projects\zdanie\zdadsa.c(31): error C2065: 'temp' : undeclared identifier
1>c:\users\conte\documents\visual studio 2010\projects\zdanie\zdadsa.c(31): error C2223: left of '->Text' must point to struct/union
1>c:\users\conte\documents\visual studio 2010\projects\zdanie\zdadsa.c(32): error C2065: 'temp' : undeclared identifier
1>c:\users\conte\documents\visual studio 2010\projects\zdanie\zdadsa.c(32): error C2223: left of '->Text' must point to struct/union
1>c:\users\conte\documents\visual studio 2010\projects\zdanie\zdadsa.c(32): error C2198: 'strcpy' : too few arguments for call
1>c:\users\conte\documents\visual studio 2010\projects\zdanie\zdadsa.c(33): error C2065: 'temp' : undeclared identifier
1>c:\users\conte\documents\visual studio 2010\projects\zdanie\zdadsa.c(33): error C2223: left of '->next' must point to struct/union
1>c:\users\conte\documents\visual studio 2010\projects\zdanie\zdadsa.c(34): error C2065: 'temp' : undeclared identifier
1>c:\users\conte\documents\visual studio 2010\projects\zdanie\zdadsa.c(34): warning C4047: '=' : 'Element *' differs in levels of indirection from 'int'
1>c:\users\conte\documents\visual studio 2010\projects\zdanie\zdadsa.c(41): error C2143: syntax error : missing ';' before 'type'
1>c:\users\conte\documents\visual studio 2010\projects\zdanie\zdadsa.c(46): error C2065: 'temp' : undeclared identifier
1>c:\users\conte\documents\visual studio 2010\projects\zdanie\zdadsa.c(46): warning C4047: '=' : 'Element *' differs in levels of indirection from 'int'
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

Tak wygląda program od 25-30 wiersza

if(buf[0] == '\n')
		{
			break;
		}

		struct Element * temp = (struct Element*) malloc(sizeof(struct Element));
3

Zmień rozszerzenie na .cpp lub dostosuj się do konwencji języka C w której na początku funkcji musisz umieścić wszystkie deklaracje zmiennych.
W tym przypadku:

struct Element * temp; // dodać na początku funkcji
temp = (struct Element*) malloc(sizeof(struct Element)); // zostaje w tym wierszu

Specjalnie dałem boldem oraz podkreśliłem kluczowy fragment.

0

Działa, wielkie dzięki. Postawiłbym wam piwo, że chciało wam się siedzieć nad takim amatorem jak ja, ale dopiero się uczę wiem, że od d**y strony, ale każda wskazówka mi się przydaje.

1 użytkowników online, w tym zalogowanych: 0, gości: 1