Forum: Mikrocontroller und Digitale Elektronik Argumentenübergabe main Funktion


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von C Anfänger (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich fange gerade an mich mit C zu beschäftigen.
Ich habe auf der Console schon die üblichen Hallo Welt Programme 
compiliert und ausgeführt.

Nun kann ich dem Programm ja auch Parameter übergeben.
Mal angenommen ich möchte dem Programm 2 integer übergeben.

Eine normale Funktion würde so aussehen
1
int addiere(int wert1, int wert2) {
2
  int ergebnis = wert1 + wert2;
3
  return ergebnis
4
}
Bei der main Funktion habe ich Probleme die Argumente zu filtern
1
int main(int argc, char* argv[]) {    
2
3
  return 0;
4
}

Wie kann ich damit arbeiten?
argv sind doch Pointer auf Strings.
Muss ich die Strings zu Zahlen zusammensetzen? Das ist doch ein 
Gefrickel ohne Ende.

Wieso kann da nicht auch stehen
1
int main(int wert1, int wert2) {
2
}

von Arduino Fanboy D. (ufuf)


Bewertung
0 lesenswert
nicht lesenswert
Kommandozeilenparameter sind strings.
Darum bekommst du strings.

Denn:
Woher sollte das Betriebssystem wissen, ob da ein Name, oder ob da eine 
Zahl kommt.

C Anfänger schrieb:
> Gefrickel
atoi()

: Bearbeitet durch User
von Keiner N. (nichtgast)


Bewertung
0 lesenswert
nicht lesenswert
Nun ja,

da gibts einfach zu viele Möglichkeiten. Der nächste will einen String 
und zwei floats übergeben, wieder einer will drei string übergeben, der 
dritte will 4 floats, ein bool und ein flag übergeben.... Merkste was? 
^^


du bekommst leider alles nur als char* und musst das dann konvertieren. 
Sollte nicht so schwer sein.

von C Anfänger (Gast)


Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Arduino F. schrieb:
> atoi()

Ok, danke das macht es natürlich einfacher.

Kann mir jemand erklären warum das im Anhang einen Fehler schmeißt?

von Lm25 (Gast)


Bewertung
0 lesenswert
nicht lesenswert
dein compiler?

von Arduino Fanboy D. (ufuf)


Bewertung
0 lesenswert
nicht lesenswert
C Anfänger schrieb:
> Kann mir jemand erklären warum das im Anhang einen Fehler schmeißt?

Weil es keinen 2ten Parameter gibt, greifst du auf Speicher zu, welcher 
nicht deinem Programm zugeordnet ist.
Es könnte die MMU sein, welche sich auf Umwegen bei dir beschwert.

: Bearbeitet durch User
von C. W. (chefkoch)


Bewertung
-2 lesenswert
nicht lesenswert
Falsche Toolchain zum Image des Pi

von Arduino Fanboy D. (ufuf)


Bewertung
0 lesenswert
nicht lesenswert
C. W. schrieb:
> Falsche Toolchain zum Image des Pi
Blödsinn...

OK, KA, kann die falsche ToolChain sein...
Ist aber hier nicht das Problem.

 char* argv[] sollte 2 Zeiger enthalten.
Unser "Autor: C Anfänger (Gast)" versucht einen dritten Zeiger zu 
nutzen. Dieser ist ungültig, und das bekommt er auch um die Ohren 
gehauen.

Also alles richtig so.

: Bearbeitet durch User
von Frank M. (ukw) (Moderator) Benutzerseite


Bewertung
2 lesenswert
nicht lesenswert
C Anfänger schrieb:
> Kann mir jemand erklären warum das im Anhang einen Fehler schmeißt?

Dein Aufruf: ./test 1,2

Parameter werden durch ein Leerzeichen getrennt und nicht durch ein 
Komma. Daher hast Du hier genau einen Parameter und nicht zwei 
übergeben.

Dabei gilt:

- argc ist die Anzahl der Argumente inkl. Programmname, also 2.
- argv[0] ist der Name des Programms, also "./test"
- argv[1] ist das erste Argument, also "1,2"
- argv[2] gibt es nicht und damit gibts einen Segfault.

Fazit:

Deine Parameterausgabe in main() macht mindestens einen dicken Fehler 
und das Programm crasht.

Um Dir weiter zu helfen, zeige den Inhalt Deines Programms, damit wir 
nicht weiter herumraten müssen. Aber bitte nicht als Foto, sondern als 
ASCII-Text.

: Bearbeitet durch Moderator
von C Anfänger (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Frank M. schrieb:
> Parameter werden durch ein Leerzeichen getrennt und nicht durch ein
> Komma.

Vielen Dank das war der Fehler, super Erklärung.

Frank M. schrieb:
> Um Dir weiter zu helfen, zeige den Inhalt Deines Programms, damit wir
> nicht weiter herumraten müssen.

Verstehe ich nicht. Du hast mein Problem zu 100% gelöst.
Das vollständige Programm und die Ausgabe hatte ich bereits oben 
gepostet.

Frank M. schrieb:
> Aber bitte nicht als Foto, sondern als
> ASCII-Text.

Aus dem Pi kan ich nicht einfach rauskopieren. Der Weg mit dem Bild 
erschien mir der schnellste zumal mein Programm super simpel ist und ich 
kein Filezilla oder ähnliches installiert habe.

von Sheeva P. (sheevaplug)


Bewertung
0 lesenswert
nicht lesenswert
C Anfänger schrieb:
> argv sind doch Pointer auf Strings.
> Muss ich die Strings zu Zahlen zusammensetzen? Das ist doch ein
> Gefrickel ohne Ende.

Bei langen Parameterlisten oder solchen von unterschiedlicher Länge kann 
das durchaus aufwändig werden. Deswegen gibt es zum Beispiel vom 
GNU-Projekt die Bibliotheken getopt und argp [1], oder für C++ 
Boost.Program_options.


[1] 
https://www.gnu.org/software/libc/manual/html_node/Parsing-Program-Arguments.html

von Frank M. (ukw) (Moderator) Benutzerseite


Bewertung
0 lesenswert
nicht lesenswert
Sheeva P. schrieb:
> Deswegen gibt es zum Beispiel vom GNU-Projekt die Bibliotheken getopt
> und argp [1],

Nur zur Info:

getopt ist keine GNU-Erfindung, sondern schon wesentlich älter und kommt 
ursprünglich von UNIX System III, stammt also aus dem Anfang der 80er. 
Natürlich gibt es da eine Adaption im GNU-Projekt.

Die eigentliche Innovation war getopt_long(), welches tatsächlich aus 
dem GNU-Projekt stammt. Damit waren dann neben den Optionen, welche aus 
lediglich einem Buchstaben bestanden (wie "ls -i") dann auch längere 
Optionsnamen möglich - wie zum Beispiel "ls --inode".

von Sheeva P. (sheevaplug)


Bewertung
0 lesenswert
nicht lesenswert
Frank M. schrieb:
> Sheeva P. schrieb:
>> Deswegen gibt es zum Beispiel vom GNU-Projekt die Bibliotheken getopt
>> und argp [1],
>
> getopt ist keine GNU-Erfindung, sondern schon wesentlich älter und kommt
> ursprünglich von UNIX System III, stammt also aus dem Anfang der 80er.

Stimmt, das hatte ich fast vergessen. Danke für den Hinweis!

von Rolf M. (rmagnus)


Bewertung
0 lesenswert
nicht lesenswert
Frank M. schrieb:
> - argv[2] gibt es nicht und damit gibts einen Segfault.

argv[2] gibt es schon. Aber es ist ein Nullzeiger. Die Liste der 
Kommandozeilenargumente ist Nullterminiert.

von Frank M. (ukw) (Moderator) Benutzerseite


Bewertung
0 lesenswert
nicht lesenswert
Rolf M. schrieb:
> argv[2] gibt es schon. Aber es ist ein Nullzeiger. Die Liste der
> Kommandozeilenargumente ist Nullterminiert.

Ja, das ist korrekt. Aber wenn man sich daran hält, dass das letzte 
Argument argv[argc - 1] ist, braucht man diese Information nicht. Diese 
zusätzliche "Absicherung" ist genaugenommen sogar redundant.

von PittyJ (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Den Raspi kann man über Netzwerk ans Internet anhängen. Dann kann man 
auf dem Raspi selber in diesem Forum browsen. Das geht alles schon mit 
den Standard-Images (Raspian).
Code kann man dann mit copy/paste einfach kopieren. Also kein Bedarf für 
Bildschirm-Photos.

von Frank M. (ukw) (Moderator) Benutzerseite


Bewertung
0 lesenswert
nicht lesenswert
PittyJ schrieb:
> Dann kann man auf dem Raspi selber in diesem Forum browsen.

Das geht auch einfacher. Einfach auf dem PC, mit dem man im Internet 
ist, per PuTTY oder einer anderen Terminalemulation eine Sitzung auf dem 
PI eröffnen.

Das hat den Vorteil, dass man als Anfänger kleinere Beispielprogramme im 
Internet direkt per Copy&Paste testen kann.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.