Static oder nicht static. Das ist hier die Frage

Hallo,

wie bekomme ich es hin, daß meine, in einem C-File vorhandenen,
Variablen auf das C-File beschränkt bleiben? Das also der Linker
diese nicht mit Variablen aus anderen C-Files verwirbelt?

Muß ich da jetzt jeweils static davor schreiben, oder eben genau nicht?

  1. Frage

Wenn ich einen struct habe:

typedef struct times {
double imsak;
double fajr;
double shuruq,
double duhr;
double asr;
double maghrib;
double ishaa;
} timesS;

und einen solchen als Ergebnis eines Funktionsaufrufs zurückliefern möchte,
wie schreibe ich das?

timeS calc(…) {
// Berechnung
times myTimes = new timeS {1,2,3,4,5,6,7};
return myTimes;
}

Ich programmiere seit Jahren nur noch Java und weiß jetzt
nicht mehr, ob es auf diese Art Speicherprobleme geben kann :confused:

In Java wird einem ja des ganze Speichergefriemel abgenommen :slight_smile:

Frage 1:
Du verwechselst hier static mit global. Deklariere die Variablen einfach lokal (in der int main()).

Frage 2:
wieso gibst du struct den Namen times? typedef besagt nichts anderes, als das du einen neuen Datentyp vereinbarst. Dem zu folge heißt jetzt struct times. Was du willst, ist eine Structur namens times, oder?

...
}blupp;```

In C gibts kein** new**! Dort wird der Speicher mit **malloc** dynamisch verwaltet.
Da es in C keine Objekte gibt, kannst du auch keins von einer Struktur machen. Also Leroy, vergiss den **new**-Kram...

Edit: Du darfst C nicht mit C++ verwechseln - dort gibts Objekte...(und new, für das Speichern auf'm Heap)

und was schreibe ich dann statt:

timeS myTimes = new timeS {1,2,3,4,5,6,7};

  int a,b,c,d;
};

int main(){
  times blupp={1,2,3,4};
  printf("%d%d%d%d",blupp.a,blupp.b,blupp.c,blupp.d);
  return 0;
}```

In dem Fall wäre blupp die Structurvariable mit der man auf die einzelnen Komponenten zugreifen kann(du würdest das Objekt nennen).

Das funktioniert nicht:

Compiler meldet „times undeclared“ :frowning:

das geht auch anders

struct times{
  int a,b,c,d;
};
 
int main(){
  struct times blupp={1,2,3,4};//das könnte vielleicht gehen
  struct times blupp2;//Sonst das
  blupp2.a=1;
  blupp2.b=2;
  blupp2.c=3;
  blupp2.d=4;

  printf("%d%d%d%d",blupp.a,blupp.b,blupp.c,blupp.d);
  return 0;
}

[QUOTE=Leroy42]Das funktioniert nicht:

Compiler meldet “times undeclared” :([/QUOTE]

Das geht, Leroy - hundert pro - bei mir gehts doch auch

[QUOTE=EagleEye]das geht auch anders

struct times{
  int a,b,c,d;
};
 
int main(){
  struct times blupp={1,2,3,4};//das könnte vielleicht gehen
  struct times blupp2;//Sonst das
  blupp2.a=1;
  blupp2.b=2;
  blupp2.c=3;
  blupp2.d=4;

  printf("%d%d%d%d",blupp.a,blupp.b,blupp.c,blupp.d);
  return 0;
}
```[/QUOTE]

Das ist doch das Gleiche - blos schreibintensiver...

Manche Compiler sehen das aber anders!
MS-Produkte fressen es und geben auch relativ wenige Warnungen zur Typenkonvertierung aus, Eclipse ist da schon weit strenger!

versuch mal folgendes auf deinem Compiler:

", time(NULL));```

Unter Eclipse musst du noch einen Cast auf INT einbauen um ohne Fehler und Warnung übersetzen zu können.

mfg
Vanice