Missing Logic Looping Through Switch Statement


 
Thread Tools Search this Thread
Top Forums Programming Missing Logic Looping Through Switch Statement
# 1  
Old 09-03-2018
Missing Logic Looping Through Switch Statement

Having trouble with the logic when looping over this switch case again:

Code:
for (j = 0; data[j] != 0; j++){
     switch(data[j]){

    case 'c': 
            output[j] = ranit(r_brace_array);
            break;
    case 'h': 
            output[j] = ranit(pipe_array);
            break;            
    case 'e':
            output[j] = ranit(tilday_array);
            break;
    case 's':
            output[j] = ranit(comma_array);
            break;
    default:    
            break;        
         }
     }


     for (i = 0; output[i] != 0; i++) {
         printf("%x\n", output[i]);
     }


It calls a function (ranit) that assigns a letter a random hex number from an array and it works fine. However, if I give this program the phrase 'cheese' you will noticed that '85f31aae' is displayed for every instance of the letter 'e':


Code:
$ ./test
Gimme something: cheese

a4d19a86
1ad33008
85f31aae
85f31aae
3927bca6
85f31aae

What I want is the function ranit() to be called again if a letter repeats. This way a repeating character does not get a repeating number. I tried making an additional outer loop, but the results did not change.

Again, had to post a code snippet due to length of code.

If anyone can help with me with the logic its greatly appreciated.
# 2  
Old 09-03-2018
What is this?

Code:
ranit(tilday_array)

Maybe it should be:

Code:
ranit(tilda_array)

?
# 3  
Old 09-03-2018
Wow... That was actually a bad copy paste while making a snipet to fit in this post. This is what I should have had:



Code:
for (j = 0; data[j] != 0; j++){
   switch(data[j]){
      case 'c':              output[j] = ranit(c_array);
             break;     
     case 'h':              output[j] = ranit(h_array);             
            break;                 
     case 'e':              output[j] = ranit(e_array);             
            break;
     case 's':              output[j] = ranit(s_array);             
            break;     
     default:                 
            break;                  
     }      
}       

for (i = 0; output[i] != 0; i++) {          
     printf("%x\n", output[i]);      
}

Hopefully that makes more sense now.
# 4  
Old 09-03-2018
Why and how do you expect varying results i.e. non-repeating numbers when running functions with non-varying, constant parameters?
# 5  
Old 09-03-2018
Maybe I should have posted more code. This is the function that is being called each time:

Code:
// Pull random array element to be called for each character.
int ranit(int char_array[]) {
    srand ( time(NULL) );
    int RandIndex = rand() % DATA_SIZE;

    return char_array[RandIndex];
}


It selects a random in the array being called and works.

In another function all the arrays mentioned have a random number with /dev/urandom generated and assigned to each element.

Sorry if I was vague. I just have about 600 lines of code now and was trying to narrow down what was relevant to fit here. My apologies.
# 6  
Old 09-03-2018
Calling random seed repeatedly is sort of overdoing it - or, in your case, even counterproductive. Do it once at program startup - if at all necessary as the compiler / interpreter may do it for you.

I know you are compiling a (C) program. Just as a hint, man awk explicitly says
Quote:
Srand(expr) is useful for repeating pseudo random sequences.
Code:
awk 'BEGIN {srand(NULL); for (i=1; i<=10; i++) print rand()}'
0.131538
0.755605
0.45865
0.532767
0.218959
0.0470446
0.678865
0.679296
0.934693
0.383502
awk 'BEGIN { for (i=1; i<=10; i++) {srand(NULL); print rand()}}'
0.131538
0.131538
0.131538
0.131538
0.131538
0.131538
0.131538
0.131538
0.131538
0.131538

Although you are calling srand() with a sort of random parameter, the current system epoch time, the execution will be that fast epoch seconds will not change - that's why you lose the random effect.


Just remove the srand() from your function.
These 2 Users Gave Thanks to RudiC For This Post:
# 7  
Old 09-03-2018
That did indeed work!

Code:
$ ./test
Gimme something: cheese

b2f14f45
f21f4f7a
1c1bc775
20737099
af749247
327683d


I knew that srand was based off the system clock and calculated fractions of seconds. I just didn't realize that a loop could iterate that fast I guess.


This also solves other problems I was having this program. Much appreciated!
Login or Register to Ask a Question

Previous Thread | Next Thread

9 More Discussions You Might Find Interesting

1. UNIX for Dummies Questions & Answers

Looping Logic, Need to implement

I need to implement a looping logic. If then Go to /path1/file* Get all the filename starting with file* and store it in a array count file number and store it in variable like run Ex: I found 3 file with starting file* so my run = 3 means my loop should run three time May be... (1 Reply)
Discussion started by: Nsharma3006
1 Replies

2. Programming

Passing arguments from command line to switch case statement in C

Hi Am pretty new to C.. Am trying to pass the arguments from command line and use them in switch case statement.. i have tried the following #include <stdlib.h> main(int argc, char* argv) { int num=0; if ( argc == 2 ) num = argv; printf("%d is the num value",num); switch ( num ) ... (2 Replies)
Discussion started by: Priya Amaresh
2 Replies

3. Shell Programming and Scripting

Logic needed to recursive looping in the script

Hello i have a requirement where in a file i will get string. The length could be from 1 to 20. if the string is less than 6 characters ( ex: ABCD) . i need to append 'X' on right hand side to make it 6 characters (ex: ABCDXX). if suppose i get the same string from the file as ABCDXX then i... (5 Replies)
Discussion started by: dsdev_123
5 Replies

4. Emergency UNIX and Linux Support

Looping using cut statement

i want to create loop for below mentioned A1=`echo $obj1 | cut -d "," -f3` A2=`echo $obj1 | cut -d "," -f4` A3=`echo $obj1 | cut -d "," -f5` A4=`echo $obj1 | cut -d "," -f6` A5=`echo $obj1 | cut -d "," -f7` A6=`echo $obj1 | cut -d "," -f8` A7=`echo $obj1 | cut -d "," -f9` A8=`echo $obj1... (3 Replies)
Discussion started by: pasricha.kunal
3 Replies

5. Shell Programming and Scripting

Something is wrong with this switch( case statement.

I started writing a script to save the files from a camera I got the other day, which mounts in /Volumes , and I got into it and started building this menu. The only problem is that the switch case is coming up as a syntax error at the parenthesis after a case. Here is the code: while : do ... (2 Replies)
Discussion started by: snakemasterAK
2 Replies

6. Shell Programming and Scripting

Missing Assigned Variable within logic operator

Hey , I'm trying to perform the following command, however it cannot read the variable assigned earlier. I'm not sure why this happen. Please help thanks while : do echo "what's ur name? (if none just press )" read name changeName = echo $name | sed "s/on/ey/" echo $changeName #this... (8 Replies)
Discussion started by: sexyTrojan
8 Replies

7. Shell Programming and Scripting

Tcl switch statement

I am just learning Tcl and there are few things about it that is perplexing me. I have a question about the switch statement. Why are these two switch statements giving me different results? $ cat test_switch.tcl #!/usr/bin/tcl set foo "abc" switch abc a - b {puts "No. 1"} $foo {puts... (2 Replies)
Discussion started by: SFNYC
2 Replies

8. Programming

Comapilation error with Switch statement

Hello , How to resolve below compilation error.activity_type is a member of structure and the output from databse will be stored in structure.Expected output wil l be either D or N or C . sample struct format: struct a{ char acAtivity_type; } code: switch (a->activity_type)... (1 Reply)
Discussion started by: jagan_kalluri
1 Replies

9. Shell Programming and Scripting

using getopt with a switch statement

hi all, i have been trying to get a script working that can take in more than one option using getopt. But for some reason, even when i type in a covered option, it skips directly to my error message of "no match." Any ideas of what might be wrong? set - 'getopt frd*: $*' for i in $* do... (6 Replies)
Discussion started by: gammarays
6 Replies
Login or Register to Ask a Question