September 03, 2007 Re: Using an uninitialized structure | ||||
---|---|---|---|---|
| ||||
Posted in reply to B. Schulte | B. Schulte wrote: > Regan Heath Wrote: > >> B. Schulte wrote: >>> Regan Heath Wrote: >>> >>>> B. Schulte wrote: >>>>> Regan Heath Wrote: >>>>> >>>>>> Where is the definition of the CHAR_INFO structure? Have you defined it in your code? eg. >>>>>> >>>>>> import std.c.windows.windows; >>>>>> >>>>>> extern(C) >>>>>> { >>>>>> struct CHAR_INFO { >>>>>> union _Char { >>>>>> WCHAR UnicodeChar; >>>>>> CHAR AsciiChar; >>>>>> } >>>>>> _Char Char; >>>>>> WORD Attributes; >>>>>> } >>>>>> alias CHAR_INFO* PCHAR_INFO; >>>>>> } >>>>>> >>>>>> void main() >>>>>> { >>>>>> CHAR_INFO buffer[]; >>>>>> buffer.length = 100; >>>>>> foreach( inout CHAR_INFO ci; buffer ) { ci.Char.AsciiChar = ' '; ci.Attributes=7; } >>>>>> } >>>>>> >>>>>> Regan >>>>> Well, the CHAR_INFO structure is stored in the win32.wincon file. There was something I took from dsource to use the winAPI methods. >>>>> >>>>> I didn't want to write in orginal files to fix a problem. I thought about fixing the problem somewhere else. (Don't modify the wincon.d) >>>>> >>>>> However, it still doesn't work. >>>>> Error 42: Symbol Undefined _D5win326wincon9CHAR_INFO6__initZ >>>>> >>>>> >>>>> There must be some way to use uninitialized variables :( >>>> There is, but I don't believe it has anything to do with the error you're getting. :) >>>> >>>> You are missing a symbol, the symbol you are missing is mangled in such a way that it is clear that it is a D symbol, which means you have defined CHAR_INFO as a D struct, instead of using extern (C) as I have shown you above. >>>> >>>> What dsource project is win32.wincon in? Perhaps CHAR_INFO isn't declared as extern (C) in there... >>>> >>>> FYI, you can allocate an array of CHAR_INFO structures without initialising like this: >>>> >>>> CHAR_INFO[500] abuffer = void; >>>> >>>> this is a fixed length array however, perhaps not what you want? >>>> >>>> >>>> Regan >>> Well, it really wasn't declared as extern(C). But I inserted it and declared it as extern(C). Don't know why, but it still don't work. >>> >>> Here is the dsource project: >>> http://dsource.org/projects/core32 >> I can't see the win32.wincon file in the svn for that project: >> http://dsource.org/projects/core32/browser/trunk/core32/win32 >> >> I retract my comment about extern (C) I think maybe this has something to do with how you're compiling it, the command line you're using. >> >> Regan > > Sorry, I was wrong. Here is the official Project page: > http://www.prowiki.org/wiki4d/wiki.cgi?WindowsAPI I thought it might be. > However, here is my command line: > > compiling: > dmd [files] -c -O -op -D -debug -version=WindowsXP > > linking: > dmd [files] This works for me: [charinfo.d] import std.c.windows.windows; import win32.wincon; void main() { CHAR_INFO[] buffer; CHAR_INFO[500] abuffer = void; buffer.length = 100; foreach( inout CHAR_INFO ci; buffer ) { ci.Char.AsciiChar = ' '; ci.Attributes=7; } } Compiled like so: E:\D\src\tmp>dmd charinfo.d -c -O -op -D -debug -version=WindowsXP E:\D\src\tmp>dmd e:\d\win32\win32\wincon.d -c -O -op -D -debug -version=WindowsXP E:\D\src\tmp>dmd charinfo.obj e:\d\win32\win32\wincon.obj E:\D\dmd\bin\..\..\dm\bin\link.exe charinfo+e:\d\win32\win32\wincon,,,user32+kernel32/noi; Note, this fails giving the error you mentioned because I am not compiling and linking with wincon.d: E:\D\src\tmp>dmd charinfo.d E:\D\dmd\bin\..\..\dm\bin\link.exe charinfo,,,user32+kernel32/noi; OPTLINK (R) for Win32 Release 7.50B1 Copyright (C) Digital Mars 1989 - 2001 All Rights Reserved charinfo.obj(charinfo) Error 42: Symbol Undefined _D5win326wincon9CHAR_INFO6__initZ --- errorlevel 1 If I include it in the compile and link, it works: E:\D\src\tmp>dmd charinfo.d e:\d\win32\win32\wincon.d E:\D\dmd\bin\..\..\dm\bin\link.exe charinfo+wincon,,,user32+kernel32/noi; Regan |
September 03, 2007 Re: Using an uninitialized structure | ||||
---|---|---|---|---|
| ||||
Posted in reply to B.Schulte | B.Schulte wrote:
> CHAR_INFO buffer[]; buffer.length = 100; foreach( inout CHAR_INFO ci;
> buffer ) { ci.Char.AsciiChar = ' '; ci.Attributes=7; }
>
> If I try to compile this (even without the foreach) I get a linker
> error. The Linker can't find the __INIT symbol of the CHAR_INFO
> structure.
The init symbol for a struct is placed into the object file generated by the source module that defines that struct. In this case, you need to link in the compiled module that defines CHAR_INFO.
|
Copyright © 1999-2021 by the D Language Foundation