C "Dumme Frage" zur Feldprogrammierung

Sahit

Admiral
🎅Rätsel-Elite ’12
Registriert
März 2010
Beiträge
8.956
Also es geht um folgendes: Ich soll werte in einem Feld in Umgekehrter Reihenfolge ausgeben.
Sollte ja soweit eigendlich nicht schwer sein nur erschließt sich mir nicht so wirklich warum als Start der If bedinung i=N-1 genommen wird und nicht i=N.

Code:
#include <stdio.h>
#define N 5

int main()
{
	// Variablen
	double werte[N] = {5.5, 3.1, 2.0, 4.3, 1.2},summe,produkt;
	int i;
	
	// Ausführbare Anweisungen
	printf("Uebung 9 - Programm feld\n\n");

	
	// Feldwerte zeilenweise am Bildschirm ausgeben
	printf("Werte:\n");
	
	for (i=0;i<N;i++)
		{
		printf("%10.2lf\n", werte[i]);
		}
		
	
	// Feldwerte in umgekehrter Reihenfolge am Bildschirm ausgeben
	printf("\nUmgekehrte Reihenfolge:\n");
	for (i=N-1;i>=0;i--)
		{
		printf("%10.2lf\n", werte[i]);
		}
 
Dein Array hat die Länge 5, du fängst aber bei 0 zu zählen an. Dein Array hat also die Felder 0,1,2,3,4, daher fängst du bei N-1 (4) an, die Werte auszugeben.
 
weil N die anzahl der felder is, da du aber via index zugreifst würde i=N einen NullPointerExc. werfen.
 
Ok könnte man dann nicht einfach oben #define N 5 zu #define N 4 ändern? Nur wenn ich dies mache wird mir beim übersetzen eine Fehlermeldung angezeigt.

Edit: Ok hatte grad nen Kommilitonen aus nem älteren Jahrgang hier ;)
Also halten wir fest: mit #define N 5 lege ich fest das ich insgesamt 5 Werte für N habe.
Allerding beginnt man im Feld schon bei 0 an zu Zählen --> Ich muss N-1 einsetzen da ich ja beim letzten Wert im Feld anfangen muss und das ist der 4te N habe ich oben aber mit 5 Definiert. So richtig?
 
Zuletzt bearbeitet:
Das ist nunmal so, da du Anzahl Elemente bei 1 anfängst du zählen der Index aber schon bei 0 losgeht. Element 1-> Index: 0 und somit Element N -> Index: N-1.
Da gewöhnt man sich aber sehr schnell dran.
 
Ok könnte man dann nicht einfach oben #define N 5 zu #define N 4 ändern? Nur wenn ich dies mache wird mir beim übersetzen eine Fehlermeldung angezeigt.

nein, dann würde die erste for-schleife ja schon bei 4 abgebrochen werden. es werden dann nur 4 (3+1 für die null, die mitgezählt wird) werte ausgegeben und nicht 5
 
Beim Vorwärtszählen zählst du auch von 0 bis N-1.
Fällt dir vielleicht nicht so ins Auge weil du "i < N" geschrieben hast, hättest auch "i <= N-1" schreiben können^^
 
Damit machst auch das Feld kürzer (N wird auch in Zeile 7 bei der Deklaration & Initialisierung des Feldes benutzt) Trotzdem stehen in den Klammern fünf Elemente, das passt dann nicht mehr rein.

Benutze einfach N-1 in der Schleife und gut ist.
 
Ok danke für die schnelle Hilfe.
Ich seh schon ich und Programmierung das wird wohl nie so richtig was werden :grr:
Zum glück studier ich nur Maschinenbau ;)
 
warum eigentlich #define und nicht int N=5? ich mein kann man machen, ist aber bei sowas eher ungewöhnlich.
 
Keine Ahnung. Die Übung bassiert auf einer vorgabe vom Prof. Eventuell verbraucht man so weniger Speicher aber kein Plan. Der Prof steht drauf wenn ein Programm möglichst klein ist weil man bei der Programmierung von Maschinen oft nur wenig RAM zu verfügung hat (so habe ich es zumindest verstanden). --> Maschinenbau Prof halt.
 
Zuletzt bearbeitet:
Mickey Cohen schrieb:
warum eigentlich #define und nicht int N=5?

Damit man sich angewöhnt mit Konstanten zu arbeiten. Das bietet Vorteile, wenn man die Größe des Feldes im Nachhinein ändern will, da man so nur die Konstante ändern muss.
 
Mickey Cohen schrieb:
warum eigentlich #define und nicht int N=5? ich mein kann man machen, ist aber bei sowas eher ungewöhnlich.

Konstanten sind gut, globale Variablen aber schlecht. Daher sollte man defines verwenden in C.

Hinweis zum Code-stil: Die Einrückungen in den Schleifen sind abenteuerlich. Richtig wäre es zum Beispiel so:
Code:
for(init(); cond(); step()) {
    statement();
}
 
Mickey Cohen schrieb:
warum eigentlich #define und nicht int N=5? ich mein kann man machen, ist aber bei sowas eher ungewöhnlich

Weil das "meistens" gar nicht geht. "Variable Array Length" geht nur ab Kompiler mit C99-Kompatibilität.
 
Problematisch wird es dann, wenn die Leute dann mit C++ anfangen und da weiter munter ihre C-style-#defines verwenden, statt ganz beherzt mal ein
Code:
constexpr size_t N = 5ul;
im richtigen Scope zu benutzen. Ist aber eine andere Baustelle.
 
Zurück
Oben