Daten richtig an Funktion übergeben

Gast #5974619
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?
Gast #5974632
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.
Gast #5974665
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.
Gast #5974702
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.
Gast #5974798
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren