www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.learn - access violation error

reply Michael P. <baseball.mjp gmail.com> writes:
/* 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

adjectives
	{
		scanf( "%s", &adjectives[ i ] );
	}
	

	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!
Aug 13 2008
next sibling parent reply Wyverex <wyverex.cypher gmail.com> writes:
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

adjectives
 	{
 		scanf( "%s", &adjectives[ i ] );
 	}
 	

 	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...
Aug 13 2008
parent reply "Koroskin Denis" <2korden gmail.com> writes:
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 =3D 6; //max number that user enters is 5, 6 to be=
=
 safe 	char[][] nouns; //same as above, but for nouns
 	nouns.length =3D 6; //same as adjectives reason
 	=
 	//get adjectives first
 	for ( int i =3D 0; i < numberOfAdjectives; i++ ) //get the specified=
 of adjectives
 	{
 		scanf( "%s", &adjectives[ i ] );
 	}
 	=

 	for ( int i =3D 0; i < numberOfNouns; i++ )
 	{
 		scanf( "%s", &nouns[ i ] );
 	}
 	=
 	//print out all possible similies
 	for ( int i =3D 0; i < numberOfAdjectives; i++ )
 	{
 		for ( int j =3D 0; j < numberOfNouns; j++ )
 		{
 			//for every adjective, place a noun after and turn it into a simil=
ie
 			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 th= is = pointer to a function that accepts a pointer to a preallocated buffer fo= r = a string to be written to. A quick fix would be to: 1) allocate a buffer: nouns[i] =3D 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 shou= ld = 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!
Aug 13 2008
next sibling parent Wyverex <wyverex.cypher gmail.com> writes:
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....
Aug 13 2008
prev sibling parent reply Michael P. <baseball.mjp gmail.com> writes:
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

 of adjectives
 	{
 		scanf( "%s", &adjectives[ i ] );
 	}
 	

 	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.
Aug 13 2008
next sibling parent reply "Koroskin Denis" <2korden gmail.com> writes:
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 possib=
le
 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 =3D 6; //max number that user enters is 5, 6 to=
be
 safe 	char[][] nouns; //same as above, but for nouns
 	nouns.length =3D 6; //same as adjectives reason
 	=
 	//get adjectives first
 	for ( int i =3D 0; i < numberOfAdjectives; i++ ) //get the specif=
 of adjectives
 	{
 		scanf( "%s", &adjectives[ i ] );
 	}
 	=

 	for ( int i =3D 0; i < numberOfNouns; i++ )
 	{
 		scanf( "%s", &nouns[ i ] );
 	}
 	=
 	//print out all possible similies
 	for ( int i =3D 0; i < numberOfAdjectives; i++ )
 	{
 		for ( int j =3D 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 wi=
ll =
 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] =3D 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 u= se.
 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.
Aug 13 2008
parent Michael P. <baseball.mjp gmail.com> writes:
 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.
Aug 13 2008
prev sibling parent "Steven Schveighoffer" <schveiguy yahoo.com> writes:
"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

 of adjectives
 {
 scanf( "%s", &adjectives[ i ] );
 }


 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
Aug 14 2008
prev sibling parent reply "Steven Schveighoffer" <schveiguy yahoo.com> writes:
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

 adjectives
 {
 scanf( "%s", &adjectives[ i ] );
 }


 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! 
Aug 13 2008
parent Gide Nwawudu <gide btinternet.com> writes:
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
Sep 17 2008