char array som pekare....

C, C++, Pascal, Assembly, Raspberry, Java, Matlab, Python, BASIC, SQL, PHP, etc.
svanted
Inlägg: 5082
Blev medlem: 30 augusti 2010, 21:20:38
Ort: Umeå

char array som pekare....

Inlägg av svanted »

hur sjutton gör man?

int main()
{
int myData = 5;
char arr[6] = {‘m’,’y’,’D’,’a’,’t’,’a’,’0’};
int i;


printf(“%d”, arr);

}

vad ska jag skriva istf "arr" i printf för att printa ut siffran 5, alltså värdet i myData?

syftet är att kunna hämta en int variabel i programmet
mha en sträng från command line(fgets)...
Användarvisningsbild
Andax
Inlägg: 4373
Blev medlem: 4 juli 2005, 23:27:38
Ort: Jönköping

Re: char array som pekare....

Inlägg av Andax »

Är inte söker på vad du menar, men normalt ska du ju ange myData direkt i printf om det ören variabeln du vill skriva ut...
Användarvisningsbild
hawkan
Inlägg: 2586
Blev medlem: 14 augusti 2011, 10:27:40

Re: char array som pekare....

Inlägg av hawkan »

%s ?

ok läste inte så bra
printf("myData: %d\n", myData);
alternativt printf("%s: %d\n", arr, myData);

Dessutom ska arr[6] vara arr[7] lång.

Äh jag har inte läst nåt bra alls. Se bra svar nedan.
Senast redigerad av hawkan 1 februari 2018, 19:41:24, redigerad totalt 3 gånger.
Nerre
Inlägg: 26655
Blev medlem: 19 maj 2008, 07:51:04
Ort: Upplands väsby

Re: char array som pekare....

Inlägg av Nerre »

svanted skrev: int main()
{
int myData = 5;
char arr[6] = {‘m’,’y’,’D’,’a’,’t’,’a’,’0’};
int i;


printf(“%d”, arr);

}

vad ska jag skriva istf "arr" i printf för att printa ut siffran 5, alltså värdet i myData?
Det går inte, inte på det sättet du tänkt dig i alla fall. Variabelnamn finns normalt inte kvar efter kompilering, de översätts till minnesadresser. Du kan alltså inte välja ut en variabel utifrån dess variabelnamn.

Det du får göra är en 2-dimensionell array där du har namnet i ena "kolumnen" och värdet i den andra. Sen får du skriva en sökfunktion som söker igenom arrayen efter "rätt" namn och då skriver ut värdet.
svanted
Inlägg: 5082
Blev medlem: 30 augusti 2010, 21:20:38
Ort: Umeå

Re: char array som pekare....

Inlägg av svanted »

tack, tänk så lite man vet....
jag kan göra en en dimensionell array då 82 tresiffriga tal ska översättas till ett indexnummer 1 - 82...
datajompa
Inlägg: 232
Blev medlem: 5 november 2010, 10:35:54

Re: char array som pekare....

Inlägg av datajompa »

Förklara mer utförligt vad du menar så går det säkert att lösa. Jag anar att det du vill göra lämpar sig för en enum.

Ett litet tips också, du har angett '0' som sista element i en char-array som du vill använda som en sträng med printf. Just i detta fall spelar det ju ingen roll eftersom det ändå inte går att göra så som du verkar ha tänkt, men annars så bör man tänka på att '0' och 0 inte är samma sak alls. '0' motsvarar i själva verket talet 48. Om du inte har en korrekt nollterminering så finns risken att du får väldigt konstiga och svårdebuggade crasher på grund av minnesskydd.

Det enklaste sättet att få en nollterminerad sträng brukar vara att använda dubbla citattecken.
Användarvisningsbild
jesse
Inlägg: 9233
Blev medlem: 10 september 2007, 12:03:55
Ort: Alingsås

Re: char array som pekare....

Inlägg av jesse »

Jag skulle gjort en array som innehåller alla talen i storleksordning

Kod: Markera allt

int arr[82] = {123, 145, 178, 211, 317, 427, ..... 988};

int i;
int myNumber = 211; // ***** input data *****

For (i = 0; i < 82;i++) {
    if (arr[i] == myNumber) break;
}

if (i < 82) {
    printf("nummer %i har index %i”, i, i);
} else {
   printf("nummer %i finns inte med i listan");
}
Hade det varit en mycket större array så hade jag kanske letat på ett snabbare sätt än att köra igenom talen ett och ett... peka på mitten av listan, kollla om talet är större eller mindre, ändra pekaren osv... tills man hittar rätt... Då behövs bara 16 sökningar i tabellen för att hitta rätt i en lista med över 65000 tal.... Eller 7 sökningar för att hitta ett tal bland 82. Men det kräver ju lite mer kod.

EDIT: Det kallas Binary search


Nu är det ju inte säkert att dina tresiffriga tal ligger i nummerordning.... då funkar inte binary search, men min funktion ovan funkar ju fortfarande.
Ett alternativ (om man inte vill söka igenom hela arrayen varje gång) är att du gör en dubbel array, med det tresiffriga talet först och indexnumret efter det... Då kan du lägga dem i nummerordning och göra binary search i arr[0]. När du funnit ditt tal läser du av indexnumret i arr[1]. Själva listan kan du lätt skapa och sortera i t.ex. Excel.

Kod: Markera allt

int arr[82][2] { 
   {123, 15},
   {145, 23},
   {198, 78},
      ....osv... 
   {986, 31}
};
Senast redigerad av jesse 2 februari 2018, 00:00:27, redigerad totalt 1 gång.
datajompa
Inlägg: 232
Blev medlem: 5 november 2010, 10:35:54

Re: char array som pekare....

Inlägg av datajompa »

Ej testat men borde funka:

Kod: Markera allt

#include<stdio.h>
#include<stdlib.h>

int map(int what)
{
   const int mapping[][2] =
   {
      {100, 0}
      ,{200, 1}
      ,{300, 2}
      ,{101, 6}
      ,{102, 101}
      // fyll på här
   };

   for(int i=0;i<sizeof(mapping)/sizeof(int);i++)
   {
      if(mapping[i][0] == what)
      {
         return mapping[i][1];
      }
   }
   return -1; // eller vad som passar som "kan ej hittas"
}

int main(int argc, char *argv[])
{
   int cmd_line_integer = atoi(argv[0]);
   printf("%d\n", map(cmd_line_integer));
}
Mr Andersson
Inlägg: 1394
Blev medlem: 29 januari 2011, 21:06:30
Ort: Lapplandet

Re: char array som pekare....

Inlägg av Mr Andersson »

Omständligt sätt att initialisera strängar :) Använd char arr[] = "myData" eller char *arr = "myData" beroende på om strängen ska vara read/write eller read only.
svanted
Inlägg: 5082
Blev medlem: 30 augusti 2010, 21:20:38
Ort: Umeå

Re: char array som pekare....

Inlägg av svanted »

datajompa, helt rätt, litet misstag om 0an...

var rackarns otydlig där,
"82 tresiffriga tal" var inte tal utan strängar typ "801", "802","803" e.t.c
eller så kan de vara tal om man omvandlar inputsträngen till en int.
vet inte vad som är enklast?

det är till fjärren i en annan tråd,
som ska tända lampor som är fysiskt numrerade 801 och uppåt,
och de är kopplade till en reläbox med lika många reläer 1 - 82?

har gjort allt i perl och där finns pekarnamnen kvar vid exekverering,
då kan man ange $L801 = 1, $L802 = 2 e.t.c.
och komma åt de genom att använda input som ett variabelnamn...
men perl är så förbålt långsamt på en raspberry att det är oanvändbart,
det tar typ 2 sekunder att aktivera ett relä.

har använt en vanlig pc tidigare då var koden momentan i perl, men raspen har ju wifi inbyggt och är mycket smidigare att bara skruva upp på väggen
som antenn, men då måste koden göras snabbare.
Användarvisningsbild
jesse
Inlägg: 9233
Blev medlem: 10 september 2007, 12:03:55
Ort: Alingsås

Re: char array som pekare....

Inlägg av jesse »

Det är väl enklast att omvandla strängarna till int innan man börjar söka efter dem. Eller att du gör en union av en int och en sträng som du lägger i arrayen. Då kan du tilldela den värden som "123" osv... för att sedan läsa ut dem som int. "123" kommer ju att passa precis i en 32-bitars int eftersom den strängen betår av exakt 4 bytes (den sista byten är en nolla eftersom det betyder 'slut på strängen'). Det gäller ju då bara att det du ska jämföra med omvandlas till en int på precis samma sätt.
datajompa
Inlägg: 232
Blev medlem: 5 november 2010, 10:35:54

Re: char array som pekare....

Inlägg av datajompa »

svanted skrev:var rackarns otydlig där,
"82 tresiffriga tal" var inte tal utan strängar typ "801", "802","803" e.t.c
eller så kan de vara tal om man omvandlar inputsträngen till en int.
vet inte vad som är enklast?
Du testade inte ens min kod va? Den gör det du bad om. Den kanske till och med går att använda som en del av ett bashscript, även om det naturligtvis är bättre att bara göra alltihop i bash i så fall!

Hur som helst så är problemet knappast att Perl är för långsamt på en Raspberry Pi som ju kör i flera hundra megaherz. Det är möjligen någon uppstartstid i så fall, och det går att lösa genom att köra programmet som en server. Problemet du ber om är extremt trivialt (Edit: och därför tar det bara några mikrosekunder att köra menar jag), jag tror att det bara kallas för en hash i Perl. Min kodsnutt är bara den absolut enklaste naiva implementationen av en hashmap i C, funkar bra för små arrayer som exempelvis 82 element.
Senast redigerad av datajompa 2 februari 2018, 14:08:15, redigerad totalt 1 gång.
Användarvisningsbild
adent
Inlägg: 4094
Blev medlem: 27 november 2008, 22:56:23
Ort: Utanför Jönköping
Kontakt:

Re: char array som pekare....

Inlägg av adent »

Ja kika på datajompas kod, den ser bra ut!

atoi-delen fixar sträng -> siffra. Sedan blir resten enklare och effektivare än att jobba med strängar.

MVH: Mikael
Användarvisningsbild
Icecap
Inlägg: 26106
Blev medlem: 10 januari 2005, 14:52:15
Ort: Aabenraa, Danmark

Re: char array som pekare....

Inlägg av Icecap »

Första steget är väl att besluta om de strängar alltid är siffror. Är det sådan är det bäst att göra om dom till värden då all sökning blir enklare.

Kan det blandas in andra tecken ska man köra med strängar.

Är de "8xx" fasta värden eller ska man kunde bygga upp registret dynamiskt?

Är det fasta värden är det just bra att definiera dom som konstanter.
Användarvisningsbild
sodjan
EF Sponsor
Inlägg: 43150
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping
Kontakt:

Re: char array som pekare....

Inlägg av sodjan »

> har gjort allt i perl och där finns pekarnamnen kvar vid exekverering,

Perl är ju ingen kompilerad miljö och i perl kan man använda "self modifying code"
vilket i princip är det som du gjorde. Varför det blev långsamt är svårt att säga, men
generellt bör perl vara mer eller mindre långsammare än en kompilerad miljö. Sen
så är "self modifying code" än mardröm rent säkerhetsmässigt, det kan vara svårt
att säkerställa att koden bara gör exakt det som var tänkt.
Skriv svar