Problem ze strukturami w C

0

Witam.

Czytałem trochę książek o C++ i Assemblerze i głównie operuję w tych technologiach. W ostatnim czasie zacząłem coś robić w C. Wszystko fajnie działa tylko wprowadziłem do programu dane struktury. Mam jeden błąd o treści: 'h' undeclared here (not in a function) i szperałem na internecie co to znaczy ale do końca nie mogłem trafić na ciekawe wyjaśnienie. Prosił bym o pomoc i wytłumaczenie co tu zaszło.

Kod:

#include <stdio.h>
#include <stdint.h>

struct First {
  char Signature[4];
  uint32_t Length;
  uint8_t Revision;
  uint8_t Checksum;
  char OEMID[6];
  char OEMTableID[8];
  uint32_t OEMRevision;
  uint32_t CreatorID;
  uint32_t CreatorRevision;
};

struct Second
{
struct First h;
uint32_t PointerToOtherSDT[(h.Length - sizeof(h)) / 4];

};

int main() {
    
    printf("Hello world");
    
    return 0;
}

Bardzo dziękuję za każdą pomoc. Pozdrawiam :)

1
struct Second
{
struct First h;
uint32_t PointerToOtherSDT[(h.Length - sizeof(h)) / 4];

};

Najpierw musiałbyś wyjaśnić co w tym miejscu chciałeś osiągnąć, bo to w sumie ja mam ochotę zapytać co tutaj zaszło? Jeśli chcesz zdeklarować rozmiar tablicy w taki sposób to musisz podać wartośc znaną w czasie kompilacji, jaka będzie wartość h.Length w trakcie kompilacji?

0

Akurat te dwie struktury były wzięte z internetu. Ale po tym skrawku kodu wnioskuje że tu chodziło bardziej o stworzenie dynamicznej tablicy zależniej od tego jaki wynik wyjdzie z tego równania. Tylko jak pisałem ja siedzę w C++ i zabawa z new wygląda trochę inaczej niż z malloc w C.

0

Akurat te dwie struktury były wzięte z internetu.

A skąd konkretnie? Możesz pokazać źródło?

Tylko jak pisałem ja siedzę w C++ i zabawa z new wygląda trochę inaczej niż z malloc w C

Przecież w kodzie nie masz żadnego new ani malloc. Jeśli chodzi o ten konkretny problem to użycie jednego czy drugiego różni się tylko detalami, więc jeśli siedzisz w C++ to najpierw pokaż jakbyś to zrobił w tym języku to potem przerobimy to na C.

0

Źródło tych struktur: https://wiki.osdev.org/RSDT

Przykład kodu w C++:

#include <iostream>
#include <string>
using namespace std; 

struct ACPISDTHeader {
  char Signature[4];
  uint32_t Length;
  uint8_t Revision;
  uint8_t Checksum;
  char OEMID[6];
  char OEMTableID[8];
  uint32_t OEMRevision;
  uint32_t CreatorID;
  uint32_t CreatorRevision;
};

struct RSDT
{
    ACPISDTHeader obj;
    uint32_t *point=new uint32_t[(obj.Length-sizeof(obj))/4];
};

int main()
{

}

Myślę że ten kod jest najbliżej pod względem działania do tamtego.

1

Źródło tych struktur: https://wiki.osdev.org/RSDT

Struktury na tej stronie nie są przykładami na poprawną deklarację. Mają one na celu opisać ile wynosi ilość elementów w tablicy. Nawet jeśli VLA pozwalałoby na taką deklarację a kompilator doszedłby czym jest obj.Length to i tak sama wartość Lenght jest niezdefiniowana. Jeśli problemem faktycznie jest tylko inicjalizacja tablicy to potrzebujesz kodu mniej więcej w takiej postaci

#include <stdint.h>
#include <stdlib.h>

struct ObjType
{
    int Lenght;
};

struct Struct
{
    struct ObjType obj;
    uint32_t *point;
};

struct Struct init(struct ObjType obj)
{
    struct Struct ret;

    ret.obj = obj;
    ret.point = (uint32_t*) malloc ((obj.Lenght - sizeof(ret.obj)) / 4);

    return ret;
}

int main()
{
    struct ObjType type;
    
    struct Struct tmp = init(type);
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1