Thread overview
access violation error
Aug 13, 2008
Michael P.
Aug 13, 2008
Wyverex
Aug 13, 2008
Koroskin Denis
Aug 13, 2008
Wyverex
Aug 14, 2008
Michael P.
Aug 14, 2008
Koroskin Denis
Aug 14, 2008
Michael P.
Sep 17, 2008
Gide Nwawudu
August 13, 2008
/* 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!
August 13, 2008
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!

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...
August 13, 2008
Most likely, this is failing because you are using scanf.  Stop using it :) Use din.readf instead:

import std.cstream;

char[] str;
din.readf("%s", &str);

-Steve

"Michael P." <baseball.mjp@gmail.com> wrote in message news:g7vi50$29f0$1@digitalmars.com...
> /* 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!


August 13, 2008
On Thu, 14 Aug 2008 01:23:05 +0400, Wyverex <wyverex.cypher@gmail.com> 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!
August 13, 2008
Koroskin Denis wrote:

> 
>> 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!



Worked on my machine!!  Though I am using tangobos....
August 14, 2008
Koroskin Denis Wrote:

> On Thu, 14 Aug 2008 01:23:05 +0400, Wyverex <wyverex.cypher@gmail.com> 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!


Sorry I made you angry...

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?
I guess I should check the documentation for some stuff like that.
August 14, 2008
On Thu, 14 Aug 2008 04:21:05 +0400, Michael P. <baseball.mjp@gmail.com> wrote:

> Koroskin Denis Wrote:
>
>> On Thu, 14 Aug 2008 01:23:05 +0400, Wyverex <wyverex.cypher@gmail.com>
>> 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!
>
>
> Sorry I made you angry...
>

No, you didn't. It just proves that C functions are unsafe and hard to use.

> 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, I think.

> I guess I should check the documentation for some stuff like that.

Well, you should understand what are you doing when using C library. It is unsafe and very error-prone.
In fact, you were doing fine, just used wrong function. Compare the following:

char[] buffer; scanf("%s", &buffer); vs char[] buffer; readf("%s", &buffer);

They are almost the same, but D version (readf) is an order of magnitude smarter and safer because of type-safe variadic functions.
August 14, 2008
> > Sorry I made you angry...
> >
> 
> No, you didn't. It just proves that C functions are unsafe and hard to use.
> 
> > 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, I think.
> 
> > I guess I should check the documentation for some stuff like that.
> 
> Well, you should understand what are you doing when using C library. It is
> unsafe and very error-prone.
> In fact, you were doing fine, just used wrong function. Compare the
> following:
> 
> char[] buffer; scanf("%s", &buffer); vs char[] buffer; readf("%s", &buffer);
> 
> They are almost the same, but D version (readf) is an order of magnitude smarter and safer because of type-safe variadic functions.


Okay, thanks, I'll be using readf from now on. :D
-Michael P.
August 14, 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


September 17, 2008
On Wed, 13 Aug 2008 17:35:42 -0400, "Steven Schveighoffer" <schveiguy@yahoo.com> wrote:

>
>Most likely, this is failing because you are using scanf.  Stop using it :) Use din.readf instead:
>
>import std.cstream;
>
>char[] str;
>din.readf("%s", &str);
>

The code above causes an Access Violaion in D2. The following works.

import std.stdio   : writeln;
import std.cstream : din;

int main() {
	char[] str;
	din.readf(&str);
	writeln(str);
	return 0;
}


Gide