Avatar billede driis Nybegynder
15. november 2003 - 13:20 Der er 15 kommentarer og
1 løsning

Problem med at lægge en værdi til en void *

Jeg har følgende linie:
pTemp = p + (i * pool[pNum].blockSize);

hvor pTemp og p er void *, i er int og pool[pNum].blockSize er unsigned int. Her får jeg fejlen
C2036 : void * : unknown size

Hvad er der galt med linien, og hvad kan jeg gøre i stedet ?
Avatar billede arne_v Ekspert
15. november 2003 - 13:23 #1
(char *)p +

eller

(int *)p +
Avatar billede arne_v Ekspert
15. november 2003 - 13:24 #2
void er en pointer til "et eller andet".

Når man ligger 7 til en char pointer tælles adressen op med 7.

Når man ligger 7 til en int pointer tælles adrssen op med 7 * sizeof(int).

Når du ligger 7 til en void pointer aner compileren ikke hvad den skal ligge til.
Avatar billede driis Nybegynder
15. november 2003 - 13:33 #3
Det havde jeg ikke tænkt på. Læg et svar.

Kan du også svare på, hvorfor følgende ikke virker ?
void * p;
(char *)p -= 4;
Avatar billede arne_v Ekspert
15. november 2003 - 13:48 #4
svar
Avatar billede arne_v Ekspert
15. november 2003 - 13:48 #5
Den konstruktion virker også hos mig.

Hvilken fejl får du ?
Avatar billede driis Nybegynder
15. november 2003 - 14:29 #6
error C2106: '-=' : left operand must be l-value

Compileren er MS VC++ 7.1
Avatar billede arne_v Ekspert
15. november 2003 - 14:31 #7
C:\>type zz.c
#include <stdlib.h>

void *f()
{
  void *p = NULL;
  (char *)p -= 4;
  return p;
}

C:\>cl/c zz.c
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 12.00.8804 for 80x86
Copyright (C) Microsoft Corp 1984-1998. All rights reserved.

zz.c
Avatar billede arne_v Ekspert
15. november 2003 - 14:32 #8
Prøv evt. med:

p = (char *)p - 4;

Dte kan være at den ikke kan lide den type cast på venstre side.
Avatar billede driis Nybegynder
15. november 2003 - 14:35 #9
p = (char *)p - 4;

virker.
Avatar billede arne_v Ekspert
15. november 2003 - 15:17 #10
Så må det jo være det.

Og generelt duer det jo helle rikke med en type cast på højre side.

Men med type cast mellem pointer typer kan jeg ikke se noget problem.

Nå - MS må have tænkt anderledes i VC++.NET !
Avatar billede bertelbrander Novice
16. november 2003 - 20:27 #11
Hvis jeg kompilerer:

void *p = (void *)0x1000;
(char *)p += 0x1000;

med gcc får jeg følgende besked:
warning: ANSI C forbids use of cast expressions as lvalues

VC++ 6.0 fortæller mig:
warning C4213: nonstandard extension used : cast on l-value

De har dog intet at indvende imod:
*(char **)&p += 0x1000;
Avatar billede arne_v Ekspert
16. november 2003 - 20:37 #12
Jeg får:

C:\>type zz.c
#include <stdlib.h>

void *f()
{
  void *p = NULL;
  (char *)p -= 4;
  return p;
}

C:\>gcc -c zz.c

C:\>cl  -c zz.c
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 12.00.8804 for 80x86
Copyright (C) Microsoft Corp 1984-1998. All rights reserved.

zz.c
Avatar billede bertelbrander Novice
16. november 2003 - 20:42 #13
D:\Program\NG\Test>cat test.c
#include <stdio.h>

int main(void)
{
  void *p = (void *)0x1000;
  printf("P: %p\n", p);
  (char *)p += 0x1000;
  printf("P: %p\n", p);

  return 0;
}

D:\Program\NG\Test>gcc -Wall -W -ansi -pedantic test.c -o test.exe
test.c: In function `main':
test.c:7: warning: ANSI C forbids use of cast expressions as lvalues

D:\Program\NG\Test>cl /W4 test.c
Microsoft (R) 32-bit C/C++ Standard Compiler Version 12.00.8168 for 80x86
Copyright (C) Microsoft Corp 1984-1998. All rights reserved.

test.c
test.c(7) : warning C4213: nonstandard extension used : cast on l-value
Microsoft (R) Incremental Linker Version 6.00.8168
Copyright (C) Microsoft Corp 1992-1998. All rights reserved.

/out:test.exe
test.obj
Avatar billede arne_v Ekspert
16. november 2003 - 20:48 #14
-Wall -W -ansi -pedantic

og

/W4

har jo nok en betydning !

:-)
Avatar billede segmose Nybegynder
17. november 2003 - 17:02 #15
Ja, han vil virkelig vide det, gad vide om lint er mere pedantisk...
Avatar billede bertelbrander Novice
17. november 2003 - 20:16 #16
Min pointe var, at hvis ANSI-standarden forbyder at man cast'er en l-value, kunne det jo tænkes at der var en kompiler der ville nægte at kompilere, hvis man forsøgte.

Iøvrigt er "-Wall -W -ansi -pedantic" standard flag når jeg kompilerer C-kode med gcc.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester