c programmieren

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Benutzeravatar
fabske
Beiträge: 2023
Registriert: 14.06.2003 15:07:51

c programmieren

Beitrag von fabske » 26.08.2004 11:12:15

ich fange gerade an c/c++ programmieren zu lernen. ich habe das buch schon seit einiger zeit, allerdings bin ich nie dazugekommen es zu lesen.
http://www.buha.info/files/user/html/id ... D-Rom.html
das buch hab ich noch zu meiner win zeit gekauft, jedoch würd ich jetzt natürlich gerne in linux programmieren.
leider fehlt mir etwas der überblick und deshalb bitte ich euch um hilfe.

ich brauche dazu:
- editor
- compiler
- linker
- debugger

als editor nehm ich bisher (für conf dateien) normalerweise immer den vim. ich kenn den gcc vom kernel backen, aber mehr kenn ich ihn auch nicht. linker und debugger kenn ich gar keinen.
vielleicht wäre auch ein kleines howto wie man die programme in kombination bedient nicht schlecht.
danke
Bevor Du einen Beitrag postest:
- Kennst Du unsere Verhaltensregeln?
- Hast Du die Suchfunktion benutzt? Deine Frage wurde vielleicht schon in einem anderen Beitrag beantwortet.
- Ist schon ein Artikel in unserem Wiki vorhanden, der Deine Frage beantwortet?

Benutzeravatar
Joghurt
Beiträge: 5244
Registriert: 30.01.2003 15:27:31
Wohnort: Hamburg
Kontaktdaten:

Beitrag von Joghurt » 26.08.2004 11:21:49

Wenn du eine IDE haben willst, nimm KDevelop (KDE) oder Anjuta (GNOME)
Ansonsten kompilierst du Programme einfach mit

Code: Alles auswählen

gcc -o Dateiname Teil1.c Teil2.c Teil3.c
evtl. nötige Libraries bindest du mit "-lname" ein, z.B. "-lm", wenn du sin und cos benutzen willst.
Für C++ nimmst du g++. Wenn du debuggen willst, nimm noch die Option "-g", um Debugging-infos zu erzeugen. Das Programm kannst du dann mit gdb debuggen, (oder dem gdb-Modus von EMACS)

Optimieren kannst du mit "-OLevel" Level 2 oder 3, für Prozessoren kannst du z.B. mit "-march=pentiumpro -mfpmath=sse -msse" optimieren

Benutzeravatar
Savar
Beiträge: 7174
Registriert: 30.07.2004 09:28:58
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Berlin

Beitrag von Savar » 26.08.2004 11:22:59

MODVOICE/MYVOICE
Debianforum Verhaltensregeln
Log Dateien? -> NoPaste

Benutzeravatar
eC
Beiträge: 354
Registriert: 24.07.2002 13:34:13
Wohnort: karlsruhe

Re: c programmieren

Beitrag von eC » 26.08.2004 11:24:26

mohameth hat geschrieben: - editor
- compiler
- linker
- debugger
Hi,

als editor nehme ich eigentlich meist nedit oder jedit
Compiler mäßig bist Du mit dem Gnu Compiler eigenlich gut bedient ;)
Passend dazu natürlich ld als Linker
Und Debuggen kannst Du mit ddd oder gdb

Zum Lernen und Nachschlagen finde ich immernoch das Buch von Kernigham und Ritchie
am Besten.

gruss

eC

Benutzeravatar
johnbecker
Beiträge: 323
Registriert: 07.08.2004 13:43:13

Beitrag von johnbecker » 26.08.2004 12:42:03

Joghurt hat geschrieben:Wenn du eine IDE haben willst, nimm KDevelop (KDE) oder Anjuta (GNOME)
kdev ist aber ganz schön unübersichtlich, habs damals als noob noch nicht mal hinbekommen, ein einfaches c-prog zu schreiben/kompilieren. das teil will einem ja dann sofort makefiles etc. erstellen.. war nach 3 min. mit dem teil so verzweifelt, dass ich lindows auf ne fat-partition installieren wollte *gg

Benutzeravatar
penthesilea
Beiträge: 147
Registriert: 19.02.2003 23:51:24
Wohnort: Ulm

Beitrag von penthesilea » 26.08.2004 13:21:23

ich kann diese 2 Seiten nur empfehlen
http://pronix.de/modules/C/openbook/
http://pronix.de/modules/C/linux/

und als editor benütze ich Kate und dazu halt den gcc

Gruss penthesilea

Benutzeravatar
pdreker
Beiträge: 8298
Registriert: 29.07.2002 21:53:30
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Nürnberg

Beitrag von pdreker » 26.08.2004 15:55:14

kdev ist aber ganz schön unübersichtlich, habs damals als noob noch nicht mal hinbekommen, ein einfaches c-prog zu schreiben/kompilieren
Ohne Dir jetzt zu nahe treten zu wollen: Das ist ein "full blown IDE" mit entsprechend vielen Features und Optionen. Dass man das nicht einfach startet und alles ist gut, sollte eigentlich vorher klar sein... Wenn man nur ein einzelnes C File 'mal eben runterschreiben will, ist eine IDE ja auch irgendwie unnötig. Editor auf, Makefile schreiben (wenn überhaupt nötig), Source schreiben, kompilieren fertig.

Unübersichtlich ist da einfach das flasche Wort. Normalerweise hat man einfach komplexere Projekte, und da ist KDevelop3 einfach göttlich. Für einfachere Sachen empfehle ich einfach Kate als Projekt-fähigen modernen GUI Editor... (Ist der Default Editor in KDevelop ;-))

Patrick
Definitely not a bot...
Jabber: pdreker@debianforum.de

Benutzeravatar
johnbecker
Beiträge: 323
Registriert: 07.08.2004 13:43:13

Beitrag von johnbecker » 26.08.2004 20:01:57

sagen wir einfach, das teil ist "komplex" *g
pdreker hat geschrieben:
kdev ist aber ganz schön unübersichtlich, habs damals als noob noch nicht mal hinbekommen, ein einfaches c-prog zu schreiben/kompilieren
Ohne Dir jetzt zu nahe treten zu wollen: [...]
tust du nicht, mal abgesehen davon, dass ich ebenfalls aus saarbrücken komm und auf den namen patrick höre.
.
.
wenn ich mir's recht überleg.. du nachmacher!! ;)

Benutzeravatar
fabske
Beiträge: 2023
Registriert: 14.06.2003 15:07:51

Beitrag von fabske » 26.08.2004 20:56:15

vielen dank für die hilfe,
ich hab alles geschafft und hab nun eine a.out datei.
aber was nun? *g*
wie führe ich das programm aus?
Bevor Du einen Beitrag postest:
- Kennst Du unsere Verhaltensregeln?
- Hast Du die Suchfunktion benutzt? Deine Frage wurde vielleicht schon in einem anderen Beitrag beantwortet.
- Ist schon ein Artikel in unserem Wiki vorhanden, der Deine Frage beantwortet?

fluid
Beiträge: 494
Registriert: 14.11.2003 21:52:49

Beitrag von fluid » 26.08.2004 21:30:21

Wie alle executables:

Code: Alles auswählen

./a.out

Benutzeravatar
fabske
Beiträge: 2023
Registriert: 14.06.2003 15:07:51

Beitrag von fabske » 27.08.2004 12:57:17

fluid hat geschrieben:Wie alle executables:

Code: Alles auswählen

./a.out
danke ;)

nur mal so aus neugierde, wenn ich die datei nun auf ne diskette kopier und mitnehm auf ein windows system, wie kann ich das programm dann da ausführen?
Bevor Du einen Beitrag postest:
- Kennst Du unsere Verhaltensregeln?
- Hast Du die Suchfunktion benutzt? Deine Frage wurde vielleicht schon in einem anderen Beitrag beantwortet.
- Ist schon ein Artikel in unserem Wiki vorhanden, der Deine Frage beantwortet?

fluid
Beiträge: 494
Registriert: 14.11.2003 21:52:49

Beitrag von fluid » 27.08.2004 16:06:16

Die Binary-Datei kannst du afaik gar nicht ausführen, da es ein ELF[1]-Executable ist. Du kannst aber die Sourcen nehmen und auf Windows kompilieren. Achso, nicht davon verwirren lassen, dass die Datei a.out heißt obwohl es ELF ist, ist nur Tradition. Siehe dazu auch [2].

[1] http://de.wikipedia.org/wiki/Executable ... ing_Format
[2] http://de.wikipedia.org/wiki/Ausf%C3%BChrbare_Datei

LittleBoy
Beiträge: 718
Registriert: 30.04.2002 14:32:26

Beitrag von LittleBoy » 27.08.2004 16:14:54

Na ja, und unter Windows kompilieren kann man das Viech auch nur wenn (a) keine reinen Linux-Libs verwendet wurden und (b) nicht auf Linux/Unix-Geräte zugegriffen wird.

fluid
Beiträge: 494
Registriert: 14.11.2003 21:52:49

Beitrag von fluid » 27.08.2004 16:23:48

Tjo, so sieht's aus mit der Portabilität...

Benutzeravatar
fabske
Beiträge: 2023
Registriert: 14.06.2003 15:07:51

Beitrag von fabske » 29.08.2004 23:54:54

ich hab nun ein kleines problem.
aufgabe: "erstellen sie ein programm, das den jeweiligen legostein bedarf anhand der angegeben höhe errechnet."
drunter is so eine skizze. eine treppe aus lego steinen: oben einer, darunter dann 2, wieder darunter dann 3, dann 4, usw.
M
MM
MMM
MMMM
könnt ihr euch sicher gut vorstellen. nun hab ich ein kleines programm geschrieben. ich hab es mit dem gcc übersetzt, geht auch einwandfrei.
wenn ich es dann ausführe fragt er mich nach der höhe der treppe, aber dann kommt: "speicherzugriffsfehler" ?

Code: Alles auswählen

# include <stdio.h>
# include <stdlib.h>
main()
{
	int h, c, steine;

printf( "Geben Sie die Hoehe an: \n");
scanf( "%d", h);

c=0;
steine=0;

for( ;c-h;c=c+1)
{
	steine=steine+1+c;
}
printf( "Steine: %d\n", steine);
}
[quote][/quote]
Bevor Du einen Beitrag postest:
- Kennst Du unsere Verhaltensregeln?
- Hast Du die Suchfunktion benutzt? Deine Frage wurde vielleicht schon in einem anderen Beitrag beantwortet.
- Ist schon ein Artikel in unserem Wiki vorhanden, der Deine Frage beantwortet?

Benutzeravatar
Dookie
Beiträge: 1104
Registriert: 17.02.2002 20:38:19
Wohnort: Salzburg
Kontaktdaten:

Beitrag von Dookie » 30.08.2004 00:25:26

Hi mohameth,

Du hast da ein & vergessen. scanf braucht die Adresse einer Variablen um die Eingabe da hineinschreiben zu können.

Code: Alles auswählen

# include <stdio.h>
# include <stdlib.h>
main()
{
   int h, c, steine;

   printf( "Geben Sie die Hoehe an: \n");
   scanf( "%d", &h);

   steine=0;

   for(c = 1; c <= h; c++)
   {
      steine = steine+c;
   }
   printf( "Steine: %d\n", steine);
} 
ich hab auch noch die For-Schelife C-typischer gemacht.

und weils so schön ist, hier auch noch eine Lösung in Python:

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: iso-8859-15 -*-

h = input("Geben sie die Höhe an:\n")
steine = sum(xrange(1, h+1))
print "Steine: %d" % steine
Gruß

Dookie

fluid
Beiträge: 494
Registriert: 14.11.2003 21:52:49

Beitrag von fluid » 30.08.2004 00:47:12

Tjo, wie Dookie schon geschrieben hat, musst du sogenannte Pointer benutzen. Lies dazu mal http://crasseux.com/books/ctutorial/Pointers.html

Generell kann ich das ganze Buch (die ganze Seite) empfehlen.

Benutzeravatar
Bert
Beiträge: 3751
Registriert: 16.07.2002 14:06:52
Wohnort: Dresden
Kontaktdaten:

Beitrag von Bert » 30.08.2004 09:53:53

oha,
darf ich fragen, nach welchem Buch Du lernst? ;-)

1. Die main() Funktion hat eine andere Signatur:

Code: Alles auswählen

int main(char *argv[], args)
Ist aus dem Kopf, aber so in etwa (ich schreib selten C / C++ und main() noch seltener)

Das scanf muß die Adresse der Zeilvariablem bekommen. Also

Code: Alles auswählen

scanf("%d",&h);
Die for Schleife ist so recht unleserlich.

Bert

[edit]
Mist man sollte nicht 3 Sachen gleichzeitig machen. Dann brauch man auch nicht so lange zum schreiben :-)

Ich würd ja lieber C++ lernen. Ist auch nicht viel schwerer, aber man gewöhnt sich gleich einen ordenlichen Stil an.
Programmer: A biological machine designed to convert caffeine into code.
xmpp:bert@debianforum.de

keyem
Beiträge: 303
Registriert: 23.08.2002 07:50:28
Wohnort: Berlin

Beitrag von keyem » 30.08.2004 10:14:04

Bert hat geschrieben: 1. Die main() Funktion hat eine andere Signatur:

Code: Alles auswählen

int main(char *argv[], args)
Ist aus dem Kopf, aber so in etwa (ich schreib selten C / C++ und main() noch seltener)
Prinzipiell hast Du recht, allerdings lautet die richtige Signatur:

Code: Alles auswählen

int main(int argc, char *argv[]);
Allerdings spricht afaik auch nichts gegen mohameths Version, sofern man keine Kommandozeilenargumente benötigt.

Benutzeravatar
fabske
Beiträge: 2023
Registriert: 14.06.2003 15:07:51

Beitrag von fabske » 30.08.2004 10:19:46

ah, vielen dank dookie, hab ich echt vergessen. aber warum hat der gcc beim übersetzen dann nicht gemeckert?? hätte ich das mit einem debugger herrausfinden können??

fluid: ist das "&h" also ein pointer? ein pointer ist ein gespeichertes wort mit bestimmter adresse, hab ich das so richtig herrausgelesen?

bert: ???


ich muss sagen dass programmieren echt spaß macht! hät ich nie gedacht. nur hab ich noch etwas probleme mit dem stil. es ist so vieles erlaubt, ich weiß net recht wie ich schreiben soll, vorallem die abstände zum linken seitenrand und das platzieren der geschweiften klammern.
hier mal mein neuestes programm, bisher mein schwerstes *stolz*
http://rafb.net/paste/results/Bu1JzO78.html
Bevor Du einen Beitrag postest:
- Kennst Du unsere Verhaltensregeln?
- Hast Du die Suchfunktion benutzt? Deine Frage wurde vielleicht schon in einem anderen Beitrag beantwortet.
- Ist schon ein Artikel in unserem Wiki vorhanden, der Deine Frage beantwortet?

Benutzeravatar
Savar
Beiträge: 7174
Registriert: 30.07.2004 09:28:58
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Berlin

Beitrag von Savar » 30.08.2004 10:45:58

nein, ist kein Pointer, sondern gibt dir "&h" die Adresse von dem Inhalt der Variablen "h" zurück.. also´die Adresse vom Speicher in dem der Inhalt der Variablen "h" liegt..

scanf schreibt dann einfach in diesen Speicher
MODVOICE/MYVOICE
Debianforum Verhaltensregeln
Log Dateien? -> NoPaste

Benutzeravatar
Joghurt
Beiträge: 5244
Registriert: 30.01.2003 15:27:31
Wohnort: Hamburg
Kontaktdaten:

Beitrag von Joghurt » 30.08.2004 11:09:19

Die for-schleife ist übrigens schlechter Stil, besser wäre:

Code: Alles auswählen

for( c=0,steine=0 ; c-h > 0 ; c++)
Das ist auch so ziemlich die einzige sinnvolle Anwendung des Komma-Operators...


BTW: 1+2+3+4+5+...+N = 1+N + 2+(N-1) + 3+(N-2) + ... = N+1 + N+1 + N+1 + ... = N*(N+1)/2, statt der Schleife geht also auch ein

Code: Alles auswählen

steine = h*(h+1)/2
Zuletzt geändert von Joghurt am 30.08.2004 11:11:16, insgesamt 1-mal geändert.

fluid
Beiträge: 494
Registriert: 14.11.2003 21:52:49

Beitrag von fluid » 30.08.2004 11:10:08

Ja, richtig. Der entgegengesetzte Fall ist, wenn du schon einen Pointer vorliegen hast in foo, weil es zum Beispiel als Pointer deklariert oder übergeben wurde (call by reference), dann kommst du mit *foo an den Inhalt der Speicherstelle.

Benutzeravatar
Savar
Beiträge: 7174
Registriert: 30.07.2004 09:28:58
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Berlin

Beitrag von Savar » 30.08.2004 11:17:51

und wenn als Pointer deklariert und initialisiert wurde, dann darfst du wiederum kein vor dem "h" haben

hmm.. ich glaub das wird jetzt verwirrend ;-)
MODVOICE/MYVOICE
Debianforum Verhaltensregeln
Log Dateien? -> NoPaste

Benutzeravatar
Bert
Beiträge: 3751
Registriert: 16.07.2002 14:06:52
Wohnort: Dresden
Kontaktdaten:

Beitrag von Bert » 30.08.2004 11:36:25

mohameth hat geschrieben:ah, vielen dank dookie, hab ich echt vergessen. aber warum hat der gcc beim übersetzen dann nicht gemeckert?? hätte ich das mit einem debugger herrausfinden können??
Es wurde angenommen, das in 'h' die Ziel - Adresse steht.
fluid: ist das "&h" also ein pointer? ein pointer ist ein gespeichertes wort mit bestimmter adresse, hab ich das so richtig herrausgelesen?
Ein Pointer ist ein Zeiger auf eine Speicheradresse.
bert: ???
Was verstehst Du denn nicht? ;-)
ich hatte aber Unsinn geschrieben. Die main() ist wie folgt deklariert:

Code: Alles auswählen

int main(int argc, char *argv[])
wobei argc die Anzahl der Parameter und argv die Parameter sund. Schreib wenigstens

Code: Alles auswählen

int main()
wenn Du die Parameter nicht brauchst. Sonnst nimmt der C Compiler an das main() ein void zurückgibt. Auf höreren Warnlevels solltest Du da einen Fehler bekommen. Ich würd Dir beim Lernen eh empfehlen den Warnlevel höher einzustellen. Sonst versaust Du Dir ganz schnel den Stil.
ich muss sagen dass programmieren echt spaß macht! hät ich nie gedacht. nur hab ich noch etwas probleme mit dem stil. es ist so vieles erlaubt, ich weiß net recht wie ich schreiben soll, vorallem die abstände zum linken seitenrand und das platzieren der geschweiften klammern.
Da gibts verschiedene Vorlieben. Schau Dir einfach mal den Code von ein paar Projekten und übernehm die Variante, die Dir gefällt.
hier mal mein neuestes programm, bisher mein schwerstes *stolz*
http://rafb.net/paste/results/Bu1JzO78.html
Mein Hinweis: gewöhn Dir am Anfang gleich ein paar Regeln an, bei kleinen Übungsprogrammen mag das noch so gehen, bei größeren sachen nicht mehr. Und sich später einen ordentlichen Stil anzugewöhnen ist schwerer.

- verwende IMMER {} Blöcke, auch wenn Du wie im Beispiel nur ein Statement hast
- Schreibweisen wie for ( ; ;b=b/2) sind sehr schlecht zu lesen und zu verstehen
- verwende aussagefähige Variablennamen. Ich hab hier einen Kollegen, der verwendet gerne c1,c2,... als Namen. Was für ein Spaß da durchzusteigen.

Versteh mich nicht falsch. Aber schlechte Gewohnheiten sind schwer wieder abzugewöhnen. Und Du willst doch nicht, das Dein Code wie Perl aussieht? ;-)

Gruß Bert
Programmer: A biological machine designed to convert caffeine into code.
xmpp:bert@debianforum.de

Antworten