access violation error

Steven Schveighoffer schveiguy at yahoo.com
Thu Aug 14 09:19:48 PDT 2008


"Michael P." wrote
> Koroskin Denis Wrote:
>
>> On Thu, 14 Aug 2008 01:23:05 +0400, Wyverex
>> wrote:
>>
>> > Michael P. wrote:
>> >> /* junior304.d
>> >> 2008 junior problem 3
>> >> Smile with similies
>> >> Ask for 2 numbers; the number of adjectives and nouns
>> >> After you get the numbers and nouns and adjectives, out all possible
>> >> similies
>> >> August 12th, 2008 */
>> >>  //Imports
>> >> import std.stdio;
>> >>  /*****
>> >> *Main*
>> >> *****/
>> >> void main()
>> >> {
>> >> int numberOfAdjectives;
>> >> scanf( "%d", &numberOfAdjectives );
>> >> int numberOfNouns;
>> >> scanf( "%d", &numberOfNouns );
>> >>
>> >> char[][] adjectives; //array of strings to hold the adjectives
>> >> adjectives.length = 6; //max number that user enters is 5, 6 to be
>> >> safe char[][] nouns; //same as above, but for nouns
>> >> nouns.length = 6; //same as adjectives reason
>> >>
>> >> //get adjectives first
>> >> for ( int i = 0; i < numberOfAdjectives; i++ ) //get the specified #
>> >> of adjectives
>> >> {
>> >> scanf( "%s", &adjectives[ i ] );
>> >> }
>> >>
>> >> //now get the # of nouns specified
>> >> for ( int i = 0; i < numberOfNouns; i++ )
>> >> {
>> >> scanf( "%s", &nouns[ i ] );
>> >> }
>> >>
>> >> //print out all possible similies
>> >> for ( int i = 0; i < numberOfAdjectives; i++ )
>> >> {
>> >> for ( int j = 0; j < numberOfNouns; j++ )
>> >> {
>> >> //for every adjective, place a noun after and turn it into a similie
>> >> writefln( "%s as %s", adjectives[ i ], nouns[ j ] );
>> >> }
>> >> }
>> >> }
>> >>   I get an accessviolation when I enter the last 2 for loops; any
>> >> reason why?
>> >>  Input is:
>> >> 3
>> >> 2
>> >> Easy
>> >> Soft
>> >> Smart
>> >> pie
>> >> rock
>> >>  error!
>> >
>> Your code is seriously broken!
>>
>> The following line is wrong, for example:
>> > scanf( "%s", &nouns[ i ] );
>>
>> What are you doing here? Are you out of your mind? You are passing a
>> pointer to a char[]* to a function that accept a char*. Your array will 
>> be
>> overwritten with whatever you will type. It is wrong, wrong, wrong!
>>
>> I think that you don't understand something. First of all, what is a
>> char[]? It is a struct that consists of a array size and a pointer:
>>
>> struct CharArray {
>>     size_t size;
>>     char* ptr;
>> }
>>
>> typeof(nounts[i]) is a char[], typeof(&nouns[i]) is char[]*. You pass 
>> this
>> pointer to a function that accepts a pointer to a preallocated buffer for
>> a string to be written to.
>>
>> A quick fix would be to:
>> 1) allocate a buffer:
>> nouns[i] = new char[64];
>> 2) pass a pointer to the preallocated buffer:
>> scanf("%s", nouns[i].ptr);
>>
>> A good fix would be to use readf instead. I didn't use it, but this 
>> should
>> be sufficient:
>> readf("%s", &nouns[i]);
>>
>>
>> > quick fix is to use printf
>> > printf( "%s as %s", &adjectives[ i ], &nouns[ j ] );
>> >
>> > i think (not sure don't really use phobos that much) scanf doesn't
>> > return strings in a format writef likes...
>> >
>> > I though theres a readf but cant find documentation on it...
>>
>> Test before posting, please!
>
> I changed all the scanfs to din.readfs and everything worked okay... does 
> that solve my passing a pointer to a string to function that accepts a 
> pointer to a char?

Yes.  both scanf and din.readf are variadic functions (meaning, they take a 
variable number and type of arguments).  However, readf is D variadic, 
meaning that along with the addresses of all the variables you want to read, 
it also gets a TypeInfo telling the function which type each argument is. 
So it can check and make sure you are passing the right type.  In fact, I 
think %s is a catch all which means for readf to use the TypeInfo to tell 
how to scan the arguments in.

The scanf function is C variadic, and so does not have this ability.  So 
when you are passing a pointer and saying 'scan in a char*', it has to take 
your word for it that you are actually passing a char ** (even though you 
were passing a char[] *)

Note that char[] is not the same as char*.  The former is a struct with a 
char* and a length in it.  The fact that it worked in your code at all is a 
miracle :)

Glad you got it working!

-Steve 




More information about the Digitalmars-d-learn mailing list