Nu ska vi C...

Elektronik- och mekanikrelaterad mjukvara/litteratur. (T.ex schema-CAD, simulering, böcker, manualer mm. OS-problem hör inte hit!)
sodjan
EF Sponsor
Inlägg: 43231
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

Tack alla !

rehnmaak> Jag gissar att problemet är att minEndDate ska vara en pekare till time_t.
rehnmaak> Du tilldelar den medlemen med *värdet* time_t.

I går kväll, samtidigt som min ADSL lina valde att lägga av, så kom jag på
att det antagligen är just det som är problemet.
Min första tanka var att gå via en extra hjälpvariabel precis som du visade.

speakman> Kom då ihåg att variablen "putte" blir out-of-scope när du returnerar från funktionen,...

Jag är inte 100% med på vilka effekter det får, men värdet är bara
intressant för själva anropet, inte efteråt, om det spelar någon roll.

> Det beror ju en hel del på vad man förväntas få i *minEndDate.

Den ska innehålla en pekare till ett time_t värde som används för urval
i SOAP anropet, i just detta fall för selektion på "avslut-datum" för
Tradera auktioner...
sodjan
EF Sponsor
Inlägg: 43231
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

Så där ja, där försvann det lilla problemet... :-)
Det kan kanske vara bra att ta även "varningar" på allvar... :-)

Så här hoppade det igång :

Kod: Markera allt

...
struct      tm    mindate_tm, maxdate_tm;
time_t      mindate_tm_tmp, maxdate_tm_tmp;
...
  mindate_tm_tmp = mktime(&mindate_tm);
  maxdate_tm_tmp = mktime(&maxdate_tm);
  gsi_params.minEndDate = &mindate_tm_tmp;
  gsi_params.maxEndDate = &maxdate_tm_tmp;
...
Nu är det lite andra problem, som hur man får gSOAP rutinerna att
skicka med "headern" till servern, men det är inget C-problem i sig...
SvenW
Inlägg: 1155
Blev medlem: 24 april 2007, 16:23:10
Ort: Göteborg

Inlägg av SvenW »

"men värdet är bara intressant för själva anropet, inte efteråt, om det spelar någon roll."

Det spelar roll.
Det är bättre att sätta pekaren till NULL när värdet inte längre behövs än att låta den vara kvar.
Den pekar ju annars fortfarande in i minnesareor som ju hela tiden återanvänds, och kan lätt orsaka svårfångade fel på helt oberoende ställen. Jfr 'Heisenbugs'.
sodjan
EF Sponsor
Inlägg: 43231
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

OK, här jag inte riktigt med. Vad är det som återanvänds ?
Pekaren pekar ju (t.ex) på mindate_tm_tmp och den är ju
statisk (som den är definierad inom main(), inte i någon
funktion) ?
Jag återanvändr varken mindate_tm_tmp eller strukturen där
pekaren till mindate_tm_tmp ligger.

Att det fungerar just nu är för övrigt verifierat med loggning
av utgående XML kod. Det som saknas nu är som sagt
"<soapenv:Header>...</soapenv:Header>" delen av det hela...
Användarvisningsbild
speakman
Inlägg: 4838
Blev medlem: 18 augusti 2004, 23:03:32
Ort: Ånge

Inlägg av speakman »

Om du gör den statisk så kommer det förmodligen se ut att fungera. Men det är definitivt en ful lösning.
Det kanske mest underliga är att den från första början vill ha en pekare. Men jag gissar att det inte är något du styr över.
Den kanske relativt korrekta lösningen borde ändå vara att du mallocerar en ny time_t-variabel för varje gång och pekar på den när du lämnar funktionen.
Beroende på hur koden ser ut får du leta dig fram nånstans där du kan fria dessa minnen.

För att köra HTTP i C brukar jag använda libcurl. Fantastiskt smidigt.

EDIT:
Kan du inte skriva ut *exakt* hur din funktion ser ut? Du ger ju mindre/sämre information själv än många du brukar klaga på här på forumet. :twisted:
Om du i samma funktion hämtar time_t-värdet, lägger en pekare på den i strukten, anropar en funktion som hanterar strukten och som sedan returnerar och då är time_t-värdet inte nödvändigt längre - ja då ska du inte ens behöva göra den static!
Ut med mer kod! Du kan ju alltid nyttja valfri Paste bin som dessutom har syntax highlight för att få in mycket kod.
SvenW
Inlägg: 1155
Blev medlem: 24 april 2007, 16:23:10
Ort: Göteborg

Inlägg av SvenW »

Jag menar att det spelar roll som felrisk. Behöver inte bli fel. Om man vet att pekaren pekar på en 'static' variabel så är den nog inte så farlig. Jag visste det inte!
sodjan
EF Sponsor
Inlägg: 43231
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

> Det kanske mest underliga är att den från första början vill ha en pekare.
> Men jag gissar att det inte är något du styr över.

Korrekt. Det skapas så av gSOAP "kompilatorn" som genererar C och H filerna
från WSDL definitionerna :

Kod: Markera allt

$ wsdl2h -c -g  -o TraderaServices.h http://api.tradera.com/v1/publicservice.asmx?WSDL
$ soapcpp2 "-C" -c -x TraderaServices.h
Första anropet skapar en första H fil.
Det andra anropet skapar sedan C funktionerna som jag anropar
och H filerna med funktions och variabel definitioner.
3 C och 3 H filer på drygt 600kB tillsammans. Inget man börjar "hacka" i i onödan... :-)

Och angående felrisken så ska denna kod bara genomlöpas en gång
rak igenom. Nästa gång anropas EXE'n på nytt, och då finns ju inget kvar
i alla fall.

> Om man vet att pekaren pekar på en 'static' variabel så är nog inte så farlig. Jag visste det inte!

Helt OK. Det var bara att du skrev "...som ju hela tiden återanvänds..." så
jag trodde att det var någon som låg utanför min kontroll på något sätt.
Användarvisningsbild
speakman
Inlägg: 4838
Blev medlem: 18 augusti 2004, 23:03:32
Ort: Ånge

Inlägg av speakman »

Om du publicerat koden som anropar både mktime och nyttjar strukten *i sin helhet* så hade förbistringar förmodligen undanvikits från första början.

Gudars vad det känns gött att få peka lite åt sodjan!! :twisted:
sodjan
EF Sponsor
Inlägg: 43231
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

You're welcome.
Alltid beredd att ställa upp för att glädja en medmänniska... :-)
sodjan
EF Sponsor
Inlägg: 43231
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

Så där jag, nu är jag tillbaka med en liten C-fråga.
Det handlar om hanterig av en struct med en struct.
Jag hoppas att jag har med tillräckligt för att förstå problemet... :-)

Definition från H filen:

Kod: Markera allt

struct SOAP_ENV__Header
{
        struct ns1__AuthenticationHeader *ns1__AuthenticationHeader;
        struct ns1__ConfigurationHeader *ns1__ConfigurationHeader;
};

struct ns1__AuthenticationHeader
{
        int AppId;
        char *AppKey;
        char *__anyAttribute;
};


struct ns1__ConfigurationHeader
{
        int Sandbox;
        char *__anyAttribute;
};
Sen har jag i min kod:

Kod: Markera allt

struct      SOAP_ENV__Header     my_header;
vilket väl ska räcka för att definiera upp alla "nivåerna", så att säga.

Nu vill jag sätta "Sandbox" till ett värde. Värdet finns som en sträng "0" i en variabel "tradapi_sandbox" som är en char[1].

Det jag har provat är :

Kod: Markera allt

my_header.ns1__ConfigurationHeader->Sandbox = atoi(tradapi_sandbox);
"atoi" för att få en INT, och "->Sandbox" eftersom "ns1__ConfigurationHeader" är en pekare, right ?

Inga kompilerings fel eller varningar, men det smäller av med en segfault (ACCVIO) vid just radan ovan.

Så frågan är om det är korrekt syntax för att sätta "Sandbox" i strukturen ?

EDIT: Det smäller av på samma sätt med:

Kod: Markera allt

my_header.ns1__ConfigurationHeader->Sandbox = 0;
så jag antar att det har något med syntaxen (och inte med variablen eller atoi)...
rehnmaak
Inlägg: 2204
Blev medlem: 13 december 2005, 01:43:41

Inlägg av rehnmaak »

SOAP_ENV__Header structen innehåller bara två stycken pekare till ns1__AuthenticationHeader och ns1__ConfigurationHeader (stjärnorna betyder att det är en pekare).

Du måste initiera medlemmarna i SOAP_ENV__Header med pekare till de två andra structarna, antingen med malloc eller genom att bara definera två structvariabler i main eller på annat bra ställe.

Kod: Markera allt



struct SOAP_ENV__Header my_header;
struct ns1__AuthenticationHeader my_auth_header;
struct ns1__ConfigurationHeader my_conf_header;

my_header.ns1__AuthenticationHeader = &my_auth_header;
my_header.ns1__ConfigurationHeader = &my_conf_header;

my_header.ns1__ConfigurationHeader->Sandbox = atoi(tradapi_sandbox);

sodjan
EF Sponsor
Inlägg: 43231
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

OK, jag funderade lite i den rikningen. Jag förstog inte riktigt hur
de två pekarna visste vart de skulle "peka" så att säga.
Jag ska testa det där snarast, det vekar ju ganska rimligt...
Skriv svar