Forum: Mikrocontroller und Digitale Elektronik Daten richtig an Funktion übergeben


von Rena (Gast)


Lesenswert?

Hallo,
ich habe ein problem bei der übergabe von einem Array. Den möchte mir in 
der Funktion send_data zunächst ausgeben lassen und dort bekomme ich 
schon eine Ausgabe, wo ich nicht weiter komme und hoffe hier auf einen 
Tip.

1
int main(int argc, char *argv[]){
2
3
  if(FAIL != init_uart()){
4
      send_data(*&argv[1], argc-1)
5
    }
6
  }
7
  return 0;
8
}
9
10
static int send_data(uint8_t buffer[], int count){
11
  printf("Datas to send:");
12
  for(uint8_t x=0; x<count; x++){
13
    printf(" 0x%X", strtol(buffer[x], NULL, 16));
14
  }
15
  printf("\n");
16
...

Wenn ich das mit gcc compilieren möchte, bekommeihc die Warnung:
passing argument 1 of 'strtol' makes pointer from integer without a cast

eingabe ist char, übergabe soll uint8_t sein. Ich möchte gerne die 
Funktion mit parametern aufrufen z.B.
1
./send 1A 80 90 FF
wobei 1A 80 90 FF als HEX-Werte interpretiert werden sollen.

Hat einer einen Tip wie ich das hinbekommen kann?

von Stefan F. (Gast)


Lesenswert?

Rena schrieb:
> *&argv[1]

Was soll das denn bedeuten? Ist das überhaupt gültiges C?

Das Programm wird mit einem Array von Zeigern auf c-Strings aufgerufen. 
Die kannst du nicht einfach in 8bit Integer umwandeln, denn erstens sind 
Zeiger größer als 8bit und zweitens willst du auf die Strings zugreifen, 
nicht auf das erste Byte der Zeiger.

Eigentlich wollte ich dir einen konkreten Korrekturvorschlag machen, 
aber das ist mir nicht gelungen weil mir gar nicht klar ist, was du 
machen willst.

Du startest das Programm mit einer Reihe von zweistelligen 
Hexadezimal-zahlen (als Zeichenketten). Diese willst mit printf() 
ausgeben. Was ich nicht verstehe ist, wozu du dann noch die Umwandlung 
in Bytes und wieder zurück zu Hexadezimal machst. Das ergibt so keinen 
Sinn.

von Rena (Gast)


Lesenswert?

Stefanus F. schrieb:
> Du startest das Programm mit einer Reihe von zweistelligen
> Hexadezimal-zahlen (als Zeichenketten). Diese willst mit printf()
> ausgeben. Was ich nicht verstehe ist, wozu du dann noch die Umwandlung
> in Bytes und wieder zurück zu Hexadezimal machst. Das ergibt so keinen
> Sinn.

Nun ja, ich möchte die Werte beim Aufrufen mit übergeben. Diese sollen 
dann als HEX-Werte interpretiert werden und in der funktion send_data 
gesendet werden.
Das printf mache ich nur, damit ich sehe, ob z.B. 1A wirklich als 0x1A 
interpretiert wird.

von Stefan F. (Gast)


Lesenswert?

1
#include <stdio.h>
2
#include <stdint.h>
3
#include <stdlib.h>
4
5
void send_data(uint8_t buffer[], int count)
6
{
7
    // Print the data. TODO: Replace this code by real sending
8
    printf("Data to send:");
9
    for(uint8_t i=0; i<count; i++)
10
    {
11
      printf(" 0x%X", buffer[i]);
12
    }
13
    printf("\n");
14
}
15
16
int main(int argc, char *argv[])
17
{
18
    uint8_t buffer[100]; // To collect bytes from command-line arguments
19
    int byte_count = 0;  // Number of bytes in buffer
20
21
    // Iterate over all command-line arguments.
22
    // start with 1 because argument 0 is the program name.
23
    for (int i=1; i<argc; i++)
24
    {
25
        char* current_argument = argv[i];
26
27
        // convert string to integer
28
        long number = strtol(current_argument, NULL, 16);
29
30
        // Append to the buffer, assuming that the number is never > 8bit
31
        buffer[byte_count] = (number & 0xFF);
32
        byte_count++;
33
    }
34
35
    // Send the data
36
    send_data(buffer, byte_count);
37
    return 0;
38
}

Bitteschön.

von zitter_ned_aso (Gast)


Lesenswert?

oder irgendwie so
1
#include <stdio.h>
2
#include <stdlib.h>
3
#include <inttypes.h>
4
5
void send_data(char** buffer, int count){
6
7
    printf("Datas to send:\n");
8
9
    for(uint8_t x=0; x<count; x++){
10
        printf("%#lX\n", strtol(buffer[x], NULL, 16));
11
    }
12
13
    printf("\n");
14
}
15
16
int main(int argc, char* argv[]){
17
18
    send_data(argv+1, argc-1);
19
20
    return 0;
21
}
1
./program 1 20 FF
2
Datas to send:
3
0X1
4
0X20
5
0XFF

Beitrag #5974841 wurde von einem Moderator gelöscht.
Beitrag #5975007 wurde von einem Moderator gelöscht.
von Ralf G. (ralg)


Lesenswert?

Rena schrieb:
> passing argument 1 of 'strtol' makes pointer from integer without a cast
1
long int strtol (const char* str, char** endptr, int base);

... du übergibst aber nur ein einzelnes Zeichen, welches in eine Adresse 
umgewandelt wird. Da das nur gaaanz selten so gedacht ist, gibt's die 
Warnung.

: Bearbeitet durch User
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.