char* w union

snout
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 37
0

Hej!
mam taki mały problem. Muszę umieścić kilka char* jako napisy w strukturze, która znajduje się w union. Pewnie niezbyt logicznie to napiałem więc na przykładzie:

Kopiuj
 
union _Test
{
    char dlugosc_napisu[30];
    struct _Snapis
    {
        char* cos1;
        char* cos2;
    }Snapis;
};


int main()
{
union _Test test;
test.Snapis.cos1 = "Mythos";
test.Snapis.cos2 = "dobre piwo";
printf("%s\n\r", test.Snapis.cos1);
printf("%s\n\r", test.Snapis.cos2);
printf("%s\n\r", test.dlugosc_napisu);
return 0;
}

Po kompilacji otrzymuje wypisany na ekranie:

Kopiuj
 
Mythos
dobre piwo
dP@

Przy odwołaniu się do dlugosc_napisu, nie powinienem miec dostępu do całego napisu "Mythos dobre piwo"?

_13th_Dragon
  • Rejestracja: dni
  • Ostatnio: dni
1
snout napisał(a):

Przy odwołaniu się do dlugosc_napisu, nie powinienem miec dostępu do całego napisu "Mythos dobre piwo"?

Nie.
Powinieneś otrzymać dwa binarne adresy (czyli 2 razy 4 znaki dla 32-bitowych, razy 8 znaków dla 64-bitowych) plus ewentualne śmiecie ze stosu
w interpretacji znakowej. Co właściwie i otrzymujesz.
Union "skleja" dane na poziomie binarnym.
Może chciałeś zrobić to:
http://ideone.com/FgQ4YD

Azarien
  • Rejestracja: dni
  • Ostatnio: dni
1
Kopiuj
    char dlugosc_napisu[30];

To jest tablica 30 znaków (mogąca pomieścić 29 znaków tekstu i końcowy znak '\0'). Tablica, nie wskaźnik, czyli bajty napisu są tu, w tym miejscu.

Kopiuj
        char* cos1;
        char* cos2;

To są dwa wskaźniki na char (na pojedyncze znaki albo na tablice, tego właściwie nie wiadomo, choć wskaźnik na pojedynczy znak ma mało sensu). Wskaźniki, nie tablice, czyli właściwe napisy nie są w tym miejscu, tylko gdzie indziej w pamięci.

snout
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 37
0

_13th_Dragon myślałem nad użyciem po prostu tablicy char, ale nie mogę skorzystać z funkcji strncp(). Kod pisany jest na mikrokontroler, nie mogę użyć biblioteki string, przez brak pamięci flash.

Czyli wynikałoby z tego że pod dlugosc_napisu[0] powinien znajdować sie adres (dla rdzenia 8bitowego) pierwszego napisu, a pod dlugosc_napisu[1] adres drugiego napis. Zgadza się?

KR
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 2518
1
Kopiuj
#include <cstdio>
#include <cstring>

union _Test
{
    char napis[30];
    struct
    {
        char cos1[15];
        char cos2[15];
    } Snapis;
};
 
 
int main()
{
  const char t1[] = "Mythos";
  const char t2[] = "dobre piwo";
  
  union _Test test;
  memset(test.napis, ' ', sizeof(test.napis));
  memcpy(test.Snapis.cos1, t1, sizeof(t1));
  memcpy(test.Snapis.cos2, t2, sizeof(t2));
  
  printf("%s\n", test.Snapis.cos1);
  printf("%s\n", test.Snapis.cos2);
  fwrite(test.napis, sizeof(test.napis), 1, stdout);
  printf("\n");
  return 0;
}
 
_13th_Dragon
  • Rejestracja: dni
  • Ostatnio: dni
1
Kopiuj
#include <stdio.h>

char *strcat(char *dst,const char *src)
  {
   char *ret=dst;
   while((*(dst++)=*(src++))!='\0') {}
   return ret;
  }

int main()
  {
   char buff_strcat[100]={0};
   char buff_sprintf[100];
   char a[]="Mythos";
   char b[]="dobre piwo";
   strcat(strcat(strcat(buff_strcat,a)," "),b);
   printf("%s\r\n",buff_strcat); // \n wystarczy ale jeżeli już to \r\n
   sprintf(buff_sprintf,"%s %s",a,b);
   printf("%s\r\n",buff_sprintf); // \n wystarczy ale jeżeli już to \r\n
   return 0;
  }
Azarien
  • Rejestracja: dni
  • Ostatnio: dni
1

Czyli wynikałoby z tego że pod dlugosc_napisu[0] powinien znajdować sie adres (dla rdzenia 8bitowego) pierwszego napisu, a pod dlugosc_napisu[1] adres drugiego napis. Zgadza się?

Nie, bo char ma (z definicji) jeden bajt, a wskaźnik zajmuje dwa, cztery, osiem... zależnie od platformy.

snout
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 37
0

Wielkie dzięki za odpowiedzi. Problemem nie jest kopiowanie danych pomiędzy dwiema tablicami. Jestem ciekaw czy jest jakiś sposób żeby użyć wskaźników, a nie tablic. W kodzie do uC korzystam z samych struktur. Po prostu, podczas pisania kodu zaciekawiło mnie jak by to wyglądało z użyciem union.

KR
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 2518
0

a potrzebujesz do tego w ogóle union?

Kopiuj
#include <cstdio>
#include <cstring>

int main()
{
  const char t1[] = "Mythos";
  const char t2[] = "dobre piwo";

  char t[30];
  char* p1 = t;
  char* p2 = t + 15;
  
  memset(t, ' ', sizeof(t));
  memcpy(p1, t1, sizeof(t1));
  memcpy(p2, t2, sizeof(t2));
 
  printf("%s\n", p1);
  printf("%s\n", p2);
  fwrite(t, sizeof(t), 1, stdout);
  printf("\n");
  
  return 0;
}

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.