Sari la conținut
ELFORUM - Forumul electronistilor

Structuri de date in microC


Drk_alien

Postări Recomandate

Salutare,

Incerc sa definesc structura asta in microC.

struct student{ char nume[30]; char prenume[30]; int an; float medie;};student s[20];void main(){ s[1].nume ="Popescu";}
Primesc erori de genul "; expected, but 's' found test.c"

" 'student' Identifier redefined test.c"

Ce nu fac bine?...m-am uitat si peste asta http://www.mikroe.com/download/eng/documents/compilers/mikroc/pro/pic/help/structures.htm dar tot primesc erori.

Ma poate ajuta cineva cu un exemplu?

 

Multumesc!

Link spre comentariu
  • Răspunsuri 13
  • Creat
  • Ultimul Răspuns

Top autori în acest subiect

  • Drk_alien

    8

  • godFather89

    3

  • grifonul_alb

    1

  • Ionut Pavel

    1

struct student

{

char nume[30];

char prenume[30];

int an;

float medie;

};student s[20];

void main()

{

s[1].nume ="Popescu";

}

 

Cred ca eroarea apare de la acel ";" pe care eu l-am colorat si marit .

Link spre comentariu

typedef struct student _STD_

{

char nume[30];

char prenume[30];

}student;

 

void main (void)

{

student s[20];

ADCON1 = 0;

TRISB = 0;

...........................

s.name = "abcdefghi";

}

 

Structura e doar o definitie in C, ea nu implica o alocare de memorie.

 

Greseala e la sfarsitul struct unde ai scris "student s[20]"

Link spre comentariu

Tu ai reusit sa compilezi bucata asta de cod? :nas: Eu am erori similare.Atentie structura trebuie definita in microC Pro, deoarece doresc sa memorez informatii despre niste butoane pe care le voi desena pe un lcd de 3310.Momentan ma lupt sa fac structura sa mearga.

Link spre comentariu

#include <string.h>struct student{	char nume[30];	char prenume[30];};void main_test(void){	struct student s[20];	strcpy(s[0].nume, "acbacd");}

fie

 

#include <string.h>typedef struct{	char nume[30];	char prenume[30];} student;void main_test(void){	student s[20];	strcpy(s[0].nume, "acbacd");}
Link spre comentariu

Am tot compilat in C++, si in microC si am ajuns la o varianta , cu ajutorul lui Ionut.

Varianta care compileaza pt microC, se pare ca trebuie sa fiu foarte atent la declararea variabilelor

typedef struct student{  char *nume;//asa compileaza// char  nume[20];//asa NU}student;void main (void){  student s[20];  s[1].nume = "Daniel";}

ps: godFather89, atat prima varianta cat si a doua functioneaza. Multumesc. :da

Link spre comentariu

Nu sunt sigur daca intelegi de ce nu merge varianta cu "char nume[20]". Motivul este simplu: in C/C++ nu se pot copia vectori prin atribuire. Cand declari nume ca pointer, ii atribuie adresa catre un string definit static (deci nu il copiaza). Problema e ca daca string-ul se dezaloca, pointerul nu mai este valid si o sa te trezesti cu tot felul de bug-uri. De exemplu:

typedef struct {  char *nume;}student;void initializeaza(student *s){ s->nume = "Daniel";}void main (void){  student s[20];  initializeaza(&s[1]);  //aici s[1].nume nu mai e valid!}

In functia initializeaza, "Daniel" va fi o zona alocata static (pe stiva) a carei adresa se va seta in pointerul nume. Problema e ca stiva se elibereaza la iesirea din functie iar pointerul nu va mai fi valid in main.

Solutia e:

-fie folosesti nume ca pointer si ii aloci memorie dinamic. In felul asta nu va mai pointa catre stiva.

-fie folosesti un array si memoria pentru nume va fi alocata static unde se declara variabila (in cazul de mai sus, in main).

In ambele cazuri, trebuie copiate valorile de pe stiva cu strcpy (sau cu alta functie similara).

Link spre comentariu

Bun, am inteles cu structurile...dar acum vin clasele

Am codul de mai jos pe care il pun in microC... (cel de jos) da o gramada de erori ex: 1) Specifier needed, 2) Invalid declarator expected'(' or identifier, 3) '' Identifier redefined

 

Pe scurt daca nu asa...atunci cum se declara o clasa ?Are microC-ul ceva diferit?...vreo versiune de c++ ??

 

//codul in C++ care merge#include <iostream>using namespace std;class CRectangle {    int x, y;  public:     void set_values (int a, int b)    {    x = a;    y = b;   }  int area ()   {    return (x*y);  }};int main () {  CRectangle rect;  rect.set_values (3,4);  cout << "area: " << rect.area();  return 0;}//####################  mai jos codul in microC  #####################using namespace std;class CRectangle {    int x, y;  public:     void set_values (int a, int b)    {    x = a;    y = b;   }  int area ()   {    return (x*y);  }};void main () {  CRectangle rect;  rect.set_values (3,4); // cout << "area: " << rect.area();}
Link spre comentariu

De ce vrei sa folosesti clase ? Pentru date fa structuri. Pentru functi (void()) frumos separate si gata. Nu faci tu cu PIC ul un joc de 1 giga unde trebuie salvat offseturi/Pointere etc...mikroC nu suporta clase pentru ca clasele se folosesc pentru a stoca date dinamice in format BYTE sau pentru "reversing engineering" unde se descompune un dll in code _asm si se definesc addrese de memorie spatii intre ele , etc un pic inalt pentru tine. In orice caz nu vad rostul de a utiliza clase in PIC pentru ca PIC ul este un simplu cip. Nu are mult RAM asa cum are un PC unde se pot stoca gigabyte de date dinamice. Si chiar nu inteleg in ce scop vroiai sa le utilizezi.

Link spre comentariu

Creează un cont sau autentifică-te pentru a adăuga comentariu

Trebuie să fi un membru pentru a putea lăsa un comentariu.

Creează un cont

Înregistrează-te pentru un nou cont în comunitatea nostră. Este simplu!

Înregistrează un nou cont

Autentificare

Ai deja un cont? Autentifică-te aici.

Autentifică-te acum



×
×
  • Creează nouă...

Informații Importante

Am plasat cookie-uri pe dispozitivul tău pentru a îmbunătății navigarea pe acest site. Poți modifica setările cookie, altfel considerăm că ești de acord să continui.Termeni de Utilizare si Ghidări