Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Dołączyć plik .h c++ do Delphi

szel 11 Cze 2012 12:12 1409 13
  • #1 11 Cze 2012 12:12
    szel
    Poziom 20  

    Mam w pliku .h c++ zadeklarowaną strukturę AGSISYMDSC, któą należy przekazać do Delphi. Nie może być przepisana do pliku .pas Delphi ponieważ jedno z pól struktury ma nazwę (type) a słowo to jest w Delphi określeniem definiowania typów (zastrzeżone). Struktura nie może być inna bo jest przekazywana do innego programu. Można próbować podpiąć plik jako .obj do Delphi, ale coś to nie pracuje poprawnie lub plik .obj jest nieprawidłowy.
    Można spróbować zadeklarować strukturę w innym języku i dołączyć do Delphi.
    Na razie mi to nie działa. Struktura jest niewidoczna. Może ktoś coś zasugeruje lub wypróbuje.
    Plik ze strukturą Agsilib.h

    Kod: cpp
    Zaloguj się, aby zobaczyć kod

    0 13
  • #2 11 Cze 2012 12:48
    michcior
    Poziom 30  

    Nie ważne jest gdzie struktura jest zdefiniowana tylko gdzie jest deklarowana jej instancja, a to nigdy nie jest plik H. W związku z tym, nie bardzo rozumiem co .obj mógłby pomóc. Jeśli potrzebujesz korzystać ze struktury w kodzie Delphi, to trzeb ją przetłumaczyć na postać Delphi.

    1) Struktura w C to "rekord" w Delphi.
    2) Uwaga na rozmiary typów, szczególnie na typy "enum". Ale i zwykły integer robił czasem kawały.
    3) Sprawdzić jaki jest domyślny "aligment" struktur.
    4) Enumy najlepiej pozamieniać na definicje stałych "CONST"

    Generalnie, potrzebna by była referencyjna kompilacja kodu w C w której można sprawdzić używając "sizeof" jakie są rozmiary wszystkich pól i całości. Tak długo kombinować aż w Delphi rozmiary będą identyczne. To jak struktura jest lokowana w pamięci bardzo silnie zleży od środowiska w którym jest kompilowana. Napisz gdzie jest ten kod w C/C++ z którym trzeba się komunikować. Przerabiałem to parę razy, trzeba uważać i nie zakładać nic.

    0
  • #3 11 Cze 2012 13:08
    szel
    Poziom 20  

    Przeczytaj uważnie, co napisałem, że nie mogę zadeklarować rekordu w Delphi bo zawiera słowo zastrzeżone i musi to być zrobione w innym języku.
    Chodzi o zadeklarowanie i zdefiniowanie struktury lub recordu AGSISYMDSC przedstawionej w pliku powyżej.

    0
  • #4 11 Cze 2012 13:09
    arnoldziq
    Moderator Programowanie

    szel napisał:
    Przeczytaj uważnie, co napisałem, że nie mogę zadeklarować rekordu w Delphi bo zawiera słowo zastrzeżone i musi to być zrobione w innym języku.

    A od kiedy to w strukturze są przekazywane nazwy zmiennych? Użycie słowa "type" nie ma żadnego znaczenia, bo można to słowo zastąpić dowolnym innym słowem. Ważne żeby typy się zgadzały.

    Sugeruję użyć do konwersji jednego z gotowych programów, do tego przeznaczonych. Dwa z nich załączam.
    Są to proste aplikacje. Nie powinno być problemów z ich użyciem.
    Jeżeli nie są wystarczające, to sugeruję zainstalować jedną z wielu nakładek na IDE, które powinny definitywnie problem rozwiązać.
    Np. to : http://rvelthuis.de/programs/convertpack.html

    0
  • #5 11 Cze 2012 13:13
    michcior
    Poziom 30  

    Nie, to bez sensu jak dla mnie. Nazwy pól w strukturze są bez znaczenia, to nie Java i nie obiekty.
    Jeśli mamy dane które należy zmapować w Delphi, to trzeba stworzyć strukturę która odpowiada bajtowo takiej samej strukturze w programie z "drugiej strony". Nazwy pól w języku programowania żyją tylko do czasu kompilacji, wiec co się martwisz, nazwij to alamakota i też będzie działać.

    0
  • #6 11 Cze 2012 13:20
    szel
    Poziom 20  

    Struktura ma zostać przekazana do innego programu.
    To w jaki sposób potem inny program w którym zdefiniowano taką samą strukturę ma wypełnić pole struktury o nazwie którego nie zna. W Delphi nie znam takiej możliwości.

    0
  • #7 11 Cze 2012 13:27
    arnoldziq
    Moderator Programowanie

    szel napisał:
    To w jaki sposób potem inny program w którym zdefiniowano taką samą strukturę ma wypełnić pole struktury o nazwie którego nie zna.

    Jak sam nazwa wskazuje; "struktura" to jakaś forma uporządkowanych danych.
    Jeżeli przekazujesz strukturę/rekord do jakiejś zewnętrznej procedury/funkcji/programu to przecież nie przekazujesz nazwy pól. Do tego służą pliki nagłówkowe lub definicje typów. Natomiast ważne jest położenie, rozmiar i zgodność bajtowa poszczególnych pól struktury/rekordu.
    Tak na prawdę, to zamiast zdefiniowanej struktury możesz wysłać dowolną tablicę bajtów, byle tylko rozmiar/położenie/długość danych się zgadzała.

    0
  • #8 11 Cze 2012 14:10
    szel
    Poziom 20  

    Teoretycznie tak. Jak jest w praktyce ...
    Próbowałem już wcześniej różnych sposobów zamiany nazw i nie współpracuje to poprawnie z funkcją w której ta struktura zostaje wykorzystana. Funkcja zwraca wynik negatywny, więc postanowiłem poszukać sposobu identycznego zadeklarowania struktury w innym języku.
    Czy w Delphi można w jakiś sposób jednym polecenieniem (nie funkcją)
    utworzyć obiekt struktury i przypisać jej wartości?
    Spróbujcie w Delphi 7 utworzyć obiekt wymienionej struktury i przypisać jej wartości.

    0
  • #9 11 Cze 2012 14:24
    michcior
    Poziom 30  

    Szczerze, trochę od podstaw. Struktura to nie obiekt. Obiekt to coś co zawiera kod i dane w "jednym". Struktura to tylko trochę danych jak każda inna zmienna, tyko nieco większa. Struktur się nie tworzy jawnie, jak obiekty. Struktury są tworzone w momencie ich deklaracji automatycznie, tak jak każda zmienna. Proszę, pomyśl nad zrozumieniem obiektowego programowania.

    Przyczyny, dla których struktura nie pasuje do danych, pochodzących z zewnętrznego "obcego" programu są takie jak już pisałem. Jak przekazujesz tą strukturę do funkcji która nie działa? Wskaźnik? W Delphi wskaźniki to niezła wirtuozeria. Może opisz w najprostszy sposób co chcesz osiągnąć bo chyba twój problem to próba rozwiązania innego problemu.

    Trochę ciężko jest nam Ci pomóc jeśli nie rozumiemy podstawowych pojęć tak samo.

    0
  • #10 11 Cze 2012 14:40
    arnoldziq
    Moderator Programowanie

    szel napisał:
    Teoretycznie tak. Jak jest w praktyce ...
    Próbowałem już wcześniej różnych sposobów zamiany nazw i nie współpracuje to poprawnie z funkcją w której ta struktura zostaje wykorzystana. Funkcja zwraca wynik negatywny, więc postanowiłem poszukać sposobu identycznego zadeklarowania struktury w innym języku.

    To nie wynika z braku użycia słowa "type" w deklaracji rekordu. Popełniłeś jakiś błąd przy przenoszeniu tej deklaracji. Np. nie uwzględniłeś typów sing/un-sign, które w Delphi po prostu nie występują.
    szel napisał:
    Czy w Delphi można w jakiś sposób jednym polecenieniem (nie funkcją)
    utworzyć obiekt struktury i przypisać jej wartości?

    Struktura (czytaj : rekord) to tylko deklaracja. Jeżeli zadeklarujesz ją jako zmienną a nie typ, to zostanie utworzona w pamięci jako zmienna rekordowa i nie musisz robić nic innego poza podaniem jakich wartości do poszczególnych pól. Jeżeli zadeklarujesz ją jako typ, to trzeba wcześniej przydzielić jej pamięć.
    Z tym, że znakomite 99% programów w C (i Delphi) nie przekazuje sobie nawzajem pomiędzy procedurami całych struktur/rekordów, tylko wskaźniki do nich.

    0
  • #11 11 Cze 2012 14:44
    szel
    Poziom 20  

    Dla mnie zawsze struktura była bliższa do obiektu-klasy niż do zmiennej chociażby ze względu na sposób dostępu do składników. Ale zostawmy to - nie jest to ważne.
    Opiszę o co chodzi.
    Mam funkcję:

    Kod: delphi
    Zaloguj się, aby zobaczyć kod


    z opisaną strukturą. Przez strukturę przekazujemy wymagane dane i funkcja wypełnia strukturę. Funkcja szuka symbolu w innym programie i jest udostępniana przez ten program (Keil-uVision) My znamy tylko jej deklarację.

    0
  • #12 11 Cze 2012 14:50
    arnoldziq
    Moderator Programowanie

    Dobra, uporządkujmy to jakoś.
    Czy ta funkcja jest dostępna poprzez mechanizm DLL ?

    0
  • #13 11 Cze 2012 15:05
    szel
    Poziom 20  

    arnoldziq napisał:
    Dobra, uporządkujmy to jakoś.
    Czy ta funkcja jest dostępna poprzez mechanizm DLL ?

    Tego to ja nie wiem, udostępnia ją Keil, my znamy tylko deklarację.
    Jest tutaj zamieszanie, bo wzorzec deklaracji został przedstawiony w C++ a ja wykorzystuję go w programie utworzonym Delphi.
    Tak wygląda orginalnna deklaracja:
    Kod: cpp
    Zaloguj się, aby zobaczyć kod

    0
  • #14 14 Cze 2012 22:19
    mocarny66
    Poziom 10  

    No to trochę odbiego od opisywanego standartu. Proponuję dostosować się do zaleceń `arnoldziq

    0