WCM - Das österreichische Computer Magazin Forenübersicht
 

Zurück   WCM Forum > Rat & Tat > Programmierung

Programmierung Rat & Tat für Programmierer

Microsoft KARRIERECAMPUS

Antwort
 
Themen-Optionen Ansicht
Alt 21.11.2003, 16:21   #1
Bastet
Elite
 
Registriert seit: 07.09.2000
Beiträge: 1.036


Standard C-Programm-fehlerhaft?

hab gerade mit c-einführung angefangen und da gibts ein übungsbeispiel:
------
#include <stdio.h>

main()
{
ausgabe(2);
}

ausgabe(wert)
int wert;

{
printf("Mein %d.", wert);
printf("C-Programm!");
}
-----
witzig daran ist, dass ich damit folgende errors habe:
wert+ausgabe - nicht deklarierter bezeichner.
main - ergebnistyp wird void angenommen (ok- des hab ich schon kapiert)
<unbekannt> funktionsstil-initialisierung scheint eine funktionsdefiniton zu sein.

also ich hab einfach mal das übungsbeispiel geändert und es hat anstandslos funktioniert, jetzt schauts so aus:

-----
#include <stdio.h>

void main()
{
int ausgabe;
ausgabe=2;

printf("Mein %d.", ausgabe);
printf("C-Programm!");
}
-----


jetzt bin ich aber ein bisserl konfus. wieso funktioniert das übungsbeispiel nicht, sondern meine eigene version? oder hab ich irgendwas daran nicht behirnt?
____________________________________
Bye Bastet

Bastet ist offline   Mit Zitat antworten
Alt 21.11.2003, 16:39   #2
hewlett
Inventar
 
Registriert seit: 08.11.2000
Alter: 42
Beiträge: 1.524


Standard

so sollte es funktionieren:

Code:
#include <stdio.h> 
void ausgabe (int wert);

void main (void)
{
   ausgabe(2);
}

void ausgabe (int wert)
{
   printf("Mein %d.", wert);
   printf("C-Programm!");
}
Dieses Buch kann ich dir auch empfehlen:
http://www.amazon.de/exec/obidos/ASI...778533-6544051
____________________________________
H.E.W.L.E.T.T.: Hydraulic Electronic Worker Limited to Exploration and Terran Troubleshooting
hewlett ist offline   Mit Zitat antworten
Alt 21.11.2003, 16:52   #3
Bastet
Elite
 
Registriert seit: 07.09.2000
Beiträge: 1.036


Standard

ja thx, aber ich kapier einfach nicht wieso das übungsbeispiel fehlerhaft ist, eigentlich sollten die beispiele doch korrekt sein!

bin eh stolz auf mich, dass ich selbst ne andere lösung gefunden hab, schliesslich weisst du ja das wievielte programm es ist
____________________________________
Bye Bastet

Bastet ist offline   Mit Zitat antworten
Alt 21.11.2003, 18:30   #4
Biri
Hero
 
Registriert seit: 04.09.2001
Beiträge: 894


Standard

obiges funktioniert nicht, weil das c-programm von "oben nach unten" abgearbeitet wird.

die main funktion "kennt" daher die Funktion <ausgabe> nicht.

lösungen:
ausgabe funktion vor der main-funktion definieren (schlechte lösung, weil nicht möglich, wenn es mehrere funktionen werden)

bessere lösung: die von hewlett - d.h. vor der main funktion einen sog. prototypen der verwendeten funktion(en) definieren.

fg + viel spaß noch beim lernen.
-hannes
Biri ist offline   Mit Zitat antworten
Alt 21.11.2003, 21:13   #5
kikakater
Inventar
 
Registriert seit: 24.01.2001
Beiträge: 5.631


Standard

Das Übungsbeispiel zeigt die ursprüngliche Schreibweise von C Code.

Ohne Prototyp und ohne Angabe eines Datentyps im Funktionskopf ist der Rückgabetyp einer Funktion immer vom Typ int (Compilerannahme).

Früher (vor dem Prototyping) hat man die Datentypen von Parametern nach dem Funktionskopf aufgelistet

int funktion(p1,p2)
int p1;
long p2;
{
...
}

Es handelt sich hier um eine alte Schreibweise, die neueren Compilern u.U. Probleme macht.
kikakater ist offline   Mit Zitat antworten
Alt 21.11.2003, 21:45   #6
AlexanderFX
Veteran
 
Registriert seit: 23.01.2003
Alter: 39
Beiträge: 224


AlexanderFX eine Nachricht über ICQ schicken
Standard

Code:
#include <stdio.h>

/* nach den includes musst du alle funktionen deklarieren 
die du in deiner c oder cpp datei verwenden willst
*/

// --> Forwärtsdeklarationen
void ausgabe (int wert);

/* 
wenn du diese vorwärtsdeclaration nicht hast kannst du
diese funktion nicht verwenden und bekommst eine fehlermeldung

außerdem solltest du immer den variablen typ schon im funktionskopf zu 
deklarierne z.B. "void ausgabe(int var1,   
int var2);

der ";" is acuh wichtig bei forwärtsdeklaration
*/

void main()  /* am besten immer den rückgabe wert der funktion dazuschreiben 
sonst übersieht ma leicht was */
{

ausgabe("2");  /* da ich mi nimmer so mit c beschäftige bin ich mir 
nicht sicher ob die "" bei der übergabe von zahlen nötig sind aber ich 
mach sie immer dazu um bessere übersicht zu bewahren */

}

void ausgabe(int wert)
//int wert;
{
printf("Mein %d.", wert);
printf("C-Programm!");
}
mfg alex
AlexanderFX ist offline   Mit Zitat antworten
Alt 22.11.2003, 09:55   #7
Bastet
Elite
 
Registriert seit: 07.09.2000
Beiträge: 1.036


Standard

herzlichen dank an alle, ihr habt mir sehr geholfen - wieder was kapiert hab.

vorallem als neuling ist es zwar noch ein bisschen verwirrend, wenn ma mal alle beispiele betrachtet und eigentlich doch immer aufs selbe ergebnis kommt. da stellt sich nur eine frage - welches beispiel sollte als richtig gelten? ja ich weiss - die logik des programmierens ist zeitweilig unergründlich
____________________________________
Bye Bastet

Bastet ist offline   Mit Zitat antworten
Alt 22.11.2003, 10:10   #8
Flink
Hero
 
Registriert seit: 29.08.2001
Alter: 57
Beiträge: 904


Flink eine Nachricht über ICQ schicken Flink eine Nachricht über Skype™ schicken
Standard

Zitat:
Original geschrieben von AlexanderFX
Code:
ausgabe("2");  /* da ich mi nimmer so mit c beschäftige bin ich mir 
nicht sicher ob die "" bei der übergabe von zahlen nötig sind aber ich mach sie immer dazu um bessere übersicht zu bewahren */
so muss das lauten:
Code:
ausgabe(2);  /* "" werden nur bei Strings (char []) verwendet */
____________________________________
Bibel
Flink ist offline   Mit Zitat antworten
Alt 22.11.2003, 10:41   #9
kikakater
Inventar
 
Registriert seit: 24.01.2001
Beiträge: 5.631


Standard

C Programme haben keine Empathie. Das heißt, Code zu schreiben ist technisch richtig oder nicht. Etwas hineinzugeheimsen spielt es nicht.

Die Emotion kommt mit dem Designergedanken, mit den Techniken herumzuspielen, im übrigen Bibliotheken zu verwenden.

Wichtig sind die Wertebereiche von Datentypen. Sowie die Unterscheidung von Datentypen zu Zeigervariablen, die Adressen beinhalten und EBEN NICHT Daten. Zeigervariablen können auch wiederum auf Zeiger - im Englischen "Pointer" - verweisen (z.B. char **argv <-- Zeiger oder char *argv[] <-- Array (=Feld)).

Unterschiedlich zu einem Zeiger ist ein Array. Das Array stellt eine Anfangsadresse von gleichlautenden Elementen oder Kapselschlüssen (Objekte) dar.

Einem Arraybezeichner kann keine neue rsp. andere Adresse im Programmlauf zugewiesen werden.

Einer Zeigervariablen schon.

char c; /* -128 bis +127 */
char *pc; /* Zeigervariable auf ein char Zeichen */
char yc[10]; /* Array mit 9 + 1 Elementen bei Verwendung als C String, sonst 10 Elemente. keine Überlaufprüfung ! */

Dynamische Anforderung von Speicher:

pc= malloc(10); /* 10 Bytes anfordern und die Anfangsadresse dieses 10 Byte großen Speicherblocks der Variablen pc zuweisen, pc sollte tunlichst als char *pc; deklariert sein. Alles andere ist unsaubere Programmierung. */

void *pv;

pv= pc;

Umtypisieren von Daten oder Zeigern:

int i;
char c;

i= (int) c; oder
i= c;

int *pi;
char *pc;

pi= (int *)pc; /* Vorsicht ! Dies ist bereits unsaubere Programmierung, und nur erlaubt, wenn man ein zweites (bzw. 3 weitere) Byte(s) hinter *pc (=dem Zeichen auf das die Adresse, die pc speichert, verweist) vorrätig hält.

Portabilität:

Zeichensatz (Umfang und Sortierreihenfolge)
Wertebereich von Datentypen
Reihenfolge der Stackargumente bei Funktionsaufrufen
Big vs. Little Endian (Lowbyte vor Highbyte und umgekehrt)
Interface Schnittstellen (Hüllfunktionen) zur Korrektur bzw. Anpassung von inkompatiblen Daten

~
kikakater ist offline   Mit Zitat antworten
Alt 23.11.2003, 18:01   #10
Bastet
Elite
 
Registriert seit: 07.09.2000
Beiträge: 1.036


Standard

Zitat:
Original geschrieben von kikakater
Das Übungsbeispiel zeigt die ursprüngliche Schreibweise von C Code.

Ohne Prototyp und ohne Angabe eines Datentyps im Funktionskopf ist der Rückgabetyp einer Funktion immer vom Typ int (Compilerannahme).

Früher (vor dem Prototyping) hat man die Datentypen von Parametern nach dem Funktionskopf aufgelistet

int funktion(p1,p2)
int p1;
long p2;
{
...
}

Es handelt sich hier um eine alte Schreibweise, die neueren Compilern u.U. Probleme macht.
stimmt, habe jetzt djgpp und die beispiele funktionieren anstandslos - naja bis auf eine klitztkleinigkeit - nach dem } endet das programm nicht - es hat ne schleife.

auch wenn ich noch ein exit hinzufüge lt. c compaktreferenz (hab so ziemlich alle exitarten ausprobiert) , dann bekomm ich immer die fehlermeldung : prase error at end of input
____________________________________
Bye Bastet

Bastet ist offline   Mit Zitat antworten
Antwort


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.

Gehe zu


Alle Zeitangaben in WEZ +2. Es ist jetzt 07:50 Uhr.


Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Forum SEO by Zoints
© 2009 FSL Verlag