getopt_long Frage



  • Hallo zusammen!

    Habe folgendes Problem. Wenn ich die untenstehende Funktion aufrufe, habe ich das Problem das nur bei case 'p' der wert von optarg in den buffer gelegt wird. rufe ich aber noch -r ARGU auf, wird der wert von optarg nicht in den buffer gelegt. Mir ist auch das ganze noch nicht so ganz klar, da ich die Erklärung in der Man-Page etwas verwirrend finde.

    Hier ist die Funktion:

    void eingabe(int argc, char *argv[],unsigned char buffer[12])
     {
     	int c;
     	//int digit_optind = 0;
     	unsigned int val=0;
    
     			static struct option long_options[] =
     		{
     		{ "setPort", 1, 0, 'p' },
     		{ "start", 0, 0, 's' },
     		{ "Reset", 2, 0, 'r' },
     		{ "Break", 2, 0, 'b' },
     		{ "CRC"  , 2, 0, 'c'},
     		{ "quit", 0, 0, 'q' },
     		{ 0, 0, 0, 0 } };
    
     	while (optind < argc) {
     		//int this_option_optind = optind ? optind : 1;
     		int option_index = 0;
    
     		c = getopt_long(argc, argv, "p:sr::b::q", long_options, &option_index);
    
     		if (c == -1)
     		    break;
    
     		switch (c)
     		{
     			case 'p':
     				{val = atoi(optarg);
     				buffer[0]=1;
     				buffer[1]=val;}
     				break;
    
     			case 's':
     				buffer[2]=1;
     				break;
    
     			case 'r':
     				//printf("Trigger auf Reset %s\n", optarg);
     				buffer[5]=1;
     				if (optarg != NULL) {
     				val = atoi(optarg);
     				buffer[7]=val;}
     				break;
    
     			case 'b':
     				//printf("Trigger auf Break %s\n", optarg);
     				buffer[6]=1;
     				if (optarg != NULL) {
     				val= atoi(optarg);
     				buffer[7]=val;}
     				break;
    
     			case 'c':
     			//printf("Trigger auf crc %s\n", optarg);
     				buffer[4] = 1;
     				if (optarg != NULL) {
    				val = atoi(optarg);
    				buffer[7] = val;
     				}
    			    break;
    
     			case 'q':
     				printf("Ende\n");
     				break;
    
     			case '?':
     				break;
    
     			default:
     				printf("?? getopt lieferte Zeichcode 0%o zurück ??\n", c);
     				break;
    
     }
    

    Und hier der Aufruf in MAIN:

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <getopt.h>
    
    #include "JobContainer.h"
    #include "lsba_error.h"
    
    /*----------------------- PROTOTYPEN ----------------------------------------*/
      void eingabe(int argc, char *argv[],unsigned char buffer[12]);
    
    /** MainFunktion zum Testen von Struct JobContainer.
     *
     *@param argc uebergabeparameter vom System
     *@param argv uebergabeparameter vom System
     *
     */
    int main(int argc,char *argv[])
    {	struct JobContainer *Job1;
    	unsigned char buffer[12]={0};
    
    eingabe(argc, argv,buffer);
    
    	return 0;
    
    }
    


  • Ich kann am getopt-spezifischen Code auf den ersten Blick nichts Falsches erkennen. Womit rufst du das Programm denn auf, dass der Fehler entsteht?



  • mit folgenden parametern:
    -p 4
    -r 1

    Wenn ich im Debug Modus durchgehe, wird in der case 'r' Anweisung die If- Bedingung nicht erfüllt. Also Optarg hat 0!! Das verstehe ich überhaut nicht.



  • problem gelöst

    optionale übergabeparameter dürfen kein leerzeichen haben

    also statt
    r 100
    r100!!!



  • Du kannst versuchen, den Kommandozeileninterpreter mit

    a.out "r 100"
    

    statt

    a.out r 100
    

    zu überreden.


Log in to reply