Computer Programming in C

Off topic posts are welcome in this forum!

Moderators: FrankM, el, Dmmoore

User avatar
3WE
Posts: 8226
Joined: Wed Feb 06, 2008 2:37 pm
Location: Flyover, America

Computer Programming in C

Postby 3WE » Thu Sep 16, 2021 3:26 pm

Ok Ocelot: I'm going to take you up on the offer.

But for starters- I need to be treated as stupid: (Ok, I ALWAYS need to be treated as stupid, but ESPECIALLY now)

What the hell does "install a Linux virtual machine" mean. Can is simply go to google, search that, and download and install something (that is free from spyware)?

What is this "K and R" I'm supposed to sit down with? I'm guessing Kernels and Routines

Show me how to code this in C and I will buy you a corn-ethanol-based beverage.

10 Input "What is your name"; A$
20 Print "Hello ";A$;", I am in control of this airplane and you have no idea what I will do next."
30 Get$ "Do you want to get off of the airplane?"; B$
40 If B$ = "y" or B$ = "Y" then 60
50 Print "Prepare to stall, spin, crash, burn and did died."
60 End

I noted your comments on "how to make it look good" and indeed that instills some fear.

10 Color 7,0,0
20 CLS
30 Locate 5, 20
40 Get$ "This is 3BS knowledge of screen formatting- pretty scary (Please enter Y or N)"; B$

(Note: I may have a few syntax errors in my BASIC...it's been a few years :lol: )
Commercial Pilot, Vandelay Industries, Inc., Plant Nutrient Division.

User avatar
elaw
Posts: 2096
Joined: Thu Jul 24, 2014 7:01 pm
Location: Massachusetts, USA
Contact:

Re: Computer Programming in C

Postby elaw » Thu Sep 16, 2021 3:37 pm

If I could suggest a path that's possibly of less resistance... instead of messing around with a VM and Linux (which can be pretty challenging), you might try installing Visual Studio Code on your PC (I'm assuming you're using a Windows machine) and start fooling around with that:

https://www.youtube.com/watch?v=GjxfGoM7Ff8
https://www.youtube.com/watch?v=77v-Poud_io

Disclaimer: I've never actually done the above. 95% of my C programming has been done on Arduino and similar platforms, in Windows-land I use C# (which is way more like C than BASIC, but it's not exactly the same).
HR consultant, Yoyodyne Propulsion Systems, Inc.

User avatar
Verbal
Posts: 3579
Joined: Fri Feb 01, 2008 9:04 pm
Location: Planet Bacterion

Re: Computer Programming in C

Postby Verbal » Thu Sep 16, 2021 6:24 pm

FORTRAN
"I'm putting an end to this f*ckery." - Rayna Boyanov

User avatar
Gabriel
Posts: 3692
Joined: Sat Feb 09, 2008 2:55 am
Location: Buenos Aires, Argentina

Re: Computer Programming in C

Postby Gabriel » Fri Sep 17, 2021 2:07 am

FORTRAN
It is very similar to BASIC. I've done both and they had a few difference in syntax and the such, but the "technique" was identical (at least for what I was using it, which was resolve large systems of linear equations), down to numbered lines and all. In fact, BASIC was more similar to FORTRAN than to Q-BASIC.

* (I used FORTRAN 77)

User avatar
Gabriel
Posts: 3692
Joined: Sat Feb 09, 2008 2:55 am
Location: Buenos Aires, Argentina

Re: Computer Programming in C

Postby Gabriel » Fri Sep 17, 2021 2:27 am

Ok Ocelot: I'm going to take you up on the offer.

But for starters- I need to be treated as stupid: (Ok, I ALWAYS need to be treated as stupid, but ESPECIALLY now)

What the hell does "install a Linux virtual machine" mean. Can is simply go to google, search that, and download and install something (that is free from spyware)?

What is this "K and R" I'm supposed to sit down with? I'm guessing Kernels and Routines

Show me how to code this in C and I will buy you a corn-ethanol-based beverage.

10 Input "What is your name"; A$
20 Print "Hello ";A$;", I am in control of this airplane and you have no idea what I will do next."
30 Get$ "Do you want to get off of the airplane?"; B$
40 If B$ = "y" or B$ = "Y" then 60
50 Print "Prepare to stall, spin, crash, burn and did died."
60 End

I noted your comments on "how to make it look good" and indeed that instills some fear.

10 Color 7,0,0
20 CLS
30 Locate 5, 20
40 Get$ "This is 3BS knowledge of screen formatting- pretty scary (Please enter Y or N)"; B$

(Note: I may have a few syntax errors in my BASIC...it's been a few years :lol: )
This was one my first programs in BASIC when I was a pre-teen and knew nothing about programming. It was right after stuff like "10 PRINT "ASSHOLE" / 20 GOT 10". And it was a videogame!!!!

I did this program in a friend's MSX computer and I learned just from watching a few of his simple programs.
It was something more or less like this:

10 P=21
20 CLS
25 PRINT "PEBBLE PICKER - The one who picks up the last pebble loses."
27 FOR I=1 to P: PRINT"*";: NEXT I
28 PRINT
30 INPUT "There are ";P;" pebbles left, pick 1, 2, or 3:"; X
40 IF X<>1 AND X<>2 AND X<>3 THEN 40 ELSE P=P-X
50 IF P<=0 THEN PRINT "You picked up the last pebble, you lost": END
57 FOR I=1 to P: PRINT"*";: NEXT I
58 PRINT
60 PRINT "There are ";P;" pebbles left, I will pick ";4-X;"."
70 P=P-(4-X)
80 GOTO 27

User avatar
3WE
Posts: 8226
Joined: Wed Feb 06, 2008 2:37 pm
Location: Flyover, America

Re: Computer Programming in C

Postby 3WE » Fri Sep 17, 2021 12:47 pm

FORTRAN
Yes, I strongly concur, but...
Commercial Pilot, Vandelay Industries, Inc., Plant Nutrient Division.

User avatar
3WE
Posts: 8226
Joined: Wed Feb 06, 2008 2:37 pm
Location: Flyover, America

Re: Computer Programming in C

Postby 3WE » Fri Sep 17, 2021 12:53 pm

This was one my first programs in BASIC when I was a pre-teen and knew nothing about programming. It was right after stuff like "10 PRINT "ASSHOLE "; / 20 GOT 10".
Version 2.0 (Fixed)

Prints repeatedly across the screen and creates a cool diagonal tiling effect if the number of characters does not divide evenly into 40. Note, I made sure to add an extra blank space for that reason.
Commercial Pilot, Vandelay Industries, Inc., Plant Nutrient Division.

User avatar
Gabriel
Posts: 3692
Joined: Sat Feb 09, 2008 2:55 am
Location: Buenos Aires, Argentina

Re: Computer Programming in C

Postby Gabriel » Fri Sep 17, 2021 5:15 pm

This was one my first programs in BASIC when I was a pre-teen and knew nothing about programming. It was right after stuff like "10 PRINT "ASSHOLE "; / 20 GOTO 10".
Version 2.0 (Fixed)

Prints repeatedly across the screen and creates a cool diagonal tiling effect if the number of characters does not divide evenly into 40. Note, I made sure to add an extra blank space for that reason.
:clap: :clap: :clap: :clap:

I love how you were careful enough to add not just the semicolon but also the blank space.

(But I just added the missing O in GOTO)

User avatar
3WE
Posts: 8226
Joined: Wed Feb 06, 2008 2:37 pm
Location: Flyover, America

Re: Computer Programming in C

Postby 3WE » Sat Sep 18, 2021 7:23 pm

(But I just added the missing O in GOTO)
Um, yeah...that would be important! :clap: :clap: :clap:
Commercial Pilot, Vandelay Industries, Inc., Plant Nutrient Division.

User avatar
monchavo
Site Admin
Posts: 1240
Joined: Sun Mar 02, 2008 9:21 am

Re: Computer Programming in C

Postby monchavo » Tue Sep 21, 2021 9:31 am

FORTRAN
I see your FORTRAN and I raise you COBOL
____
Join the airdisaster Discord - https://discord.gg/A59Vdw73ET

User avatar
ocelot
Posts: 689
Joined: Thu Jan 15, 2009 9:26 pm
Location: /bin/cat

Re: Computer Programming in C

Postby ocelot » Tue Sep 21, 2021 10:26 am

What the hell does "install a Linux virtual machine" mean. Can is simply go to google, search that, and download and install something (that is free from spyware)?
For the most part you actually can, yes. One of the neat things to appear in the past twenty years or so is widgets for emulating (hence "virtual") the hardware interface of the computer (hence "machine") that actually run at a useful speed. Which means you can have a Linux machine in a window. VMware and VirtualBox are the most popular tools for this; not sure what the current deal with free vs. payware licensing and versions is, especially if you're running on Windows.

Basically you install the thing, tell it to create a new virtual machine, and you should be able to pick any of several flavors of Linux from a menu (Ubuntu is probably the safest choice), wait a while as it downloads some rather large install images, follow the install steps (which is mostly stuff like picking which keyboard layout you have) and you end up with a working Linux install in a window. If everything goes right, but mostly it does. There are guides on the internets and if something goes wrong you can feed what happened to Google and generally get useful information back.

Then open a terminal window and do "sudo apt install build-essential" to get the compiler, and you'll need a text editor as well; I think gedit is the recommended path for Unix beginners at this point.

Granted, this is not a small operation, and as elaw pointed out it might be better to use a Windows compiler. The reason I suggest Linux is that (a) Unix is C's native environment and a bunch of things are easier there, and (b) the last time I wrote any code on Windows, Boeing was still making new 737-500s, so I have little ability to advise or assist there.
What is this "K and R" I'm supposed to sit down with? I'm guessing Kernels and Routines
"K&R" is "Kernighan and Ritchie", the original book on the C language. Those are the authors; the title is "The C Programming Language". The first edition is out of date, but the second edition is still as good as anything else as introductory material -- other people may have other favorite learning-C books (there are a lot of them) but I know of no particularly good reason to favor anything else.

User avatar
ocelot
Posts: 689
Joined: Thu Jan 15, 2009 9:26 pm
Location: /bin/cat

Re: Computer Programming in C

Postby ocelot » Tue Sep 21, 2021 10:30 am

Here's how to turn the lights on:
#include <stdio.h>

int main(void) {
printf("Hello, world\n");
return 0;
}
Put that in a file called "hello.c", then run "gcc -Wall hello.c -o hello" (gcc is the compiler) and that will give you a program called "hello" that you can run as "./hello". It will print "Hello, world" to the terminal window you run it in.

Note that the bits inside the braces are supposed to be indented to set them off from the rest; this helps a lot with legibility and is one of the things whipped into freshmen taking CS 101, but I haven't been able to figure out how to get the site to display that way.

User avatar
ocelot
Posts: 689
Joined: Thu Jan 15, 2009 9:26 pm
Location: /bin/cat

Re: Computer Programming in C

Postby ocelot » Tue Sep 21, 2021 10:34 am

With luck, this is what it's supposed to look like.
hello.png
hello.png (652 Bytes) Viewed 5520 times

User avatar
ocelot
Posts: 689
Joined: Thu Jan 15, 2009 9:26 pm
Location: /bin/cat

Re: Computer Programming in C

Postby ocelot » Tue Sep 21, 2021 11:30 am

Apparently I can't attach text files, but it looks like I can attach a zip file full of text files... here are three quick examples. The first (fly.c) avoids interactive input (because it gets messy) and instead takes its input on the command line when you run it: compile it with gcc -Wall fly.c -o fly, then run it with ./fly 3we.

The second (fly2.c) is your example but there's some additional mess: fflush(stdout) makes the previous print display even though it's not printed a full line yet (by default the output is line-buffered), and then after reading the name with "fgets" it has to remove the return you had to type to enter it from the end of the string because that's how the fgets function works. (The second fgets just ignores everything besides the first character.)

The third (fly3.c) is an improved version that prints on the screen; compile it with gcc -Wall fly3.c -lcurses -o fly3 and run it with ./fly3. (You might need -ltermcap as well as -lcurses, or maybe -lncurses instead of -lcurses, and you might need to change <curses.h> in the file to <ncurses.h> or <ncurses/ncurses.h> or <ncurses/curses.h>, depending on exact system details, and rubbish like this is part of why things get messy.)

Points of note in these:

"printf" prints on the "standard output" (hence "stdout"), which is by default the terminal you run the program in. Likewise, fgets reads from "standard input" (aka "stdin") which is by default also the terminal you run the program in. Either can be redirected to/from (respectively) a file in the Unix shell, which you may remember how to do from DOS, and your program doesn't need to know anything about this.

The string passed to printf can contain "%s", which inserts another string passed as an extra argument. (It can also be %d, which takes an integer, or various other things.) These are handled on the fly when the program runs. Strings (not just printf) can also contain backslash-escapes, where \n gives the end-of-line character, \b is backspace, \t is tab, and there are a few others. These are handled by the compiler when you compile the program, and are fundamentally different from the % widgets in printf.

% outside a string is modulus; random() % 4 == 0 is true 1 in 4 times. Oh, and == (two equals signs) is equality comparison; = (one equal sign) is assignment. IIRC in BASIC both are one equals sign and the BASIC interpreter tries to figure out which you meant from context, which sometimes results in strange things happening.

In C subroutines are called "functions"; "int main(void)" is a function that takes no arguments ("void" is a type name, but means "nothing", empty parentheses mean something else for historical reasons) and returns an integer. "void die(void)" is a function that takes no arguments and returns nothing. "void fly(const char *name)" is a function that takes one argument, "name", which is a string (a pointer to one or more characters which we aren't going to modify, hence "const") -- by convention in C strings are sequences of characters with the end marked by a zero (ascii 0, not the character '0') and you pass them around by pointing to the first character.

Which brings me to pointers -- the thing in C that confuses people the most and that beginners trip on, and that you can't avoid because you really can't do very much without bumping into one. In most languages a variable is a slot you can put a value in; e.g. if you have an integer variable you can put 1 or 2 or 10 into it, because those are integer values. A pointer is a different kind of value; it's a piece of paper that says where to find something else. So if I have a pointer variable whose type says it points to an integer, the pointer values you can put in it are pieces of paper that say where you can find an integer. There's an operator that takes the address of some other variable to make a pointer (it's "&", so "&x" is the address of x) -- this writes down the address on a piece of paper, which you can then pass around. There's also an operator that reads the piece of paper and goes and gets the value from the address it finds; that's "*", so "*y" gets the value that y points to. (This is called "dereferencing" it.) In the case of strings, a string constant like "hello" is stored in the program by the compiler somewhere and the value you get in your program is a piece of paper that says where it is. This value can then be passed to printf, or fly(), or whatever else.

If you have an array, like "char name[64]" in fly2.c (that's like DIM NAME(64) in BASIC), you can use the name of the array as a pointer to the first element. So we can pass this array to fgets(), which fills it in with the input (the sizeof argument says how big it is, which is important for not trying to put too much in, and the stdin argument says where to get the input from) and then we have a string that we can get the length of with strlen and pass to printf for printing. Likewise later when it gets another string "yn", because it's an array of characters we can look at the first character by indexing the array with [0].

NULL is an invalid pointer; basically it's a piece of paper with "oops" written on it, and if you try to dereference it the program will crash.

The problem beginners always have is that they don't really understand that the pointer is separate from the stuff it points to, and it always has to point to something real in the program memory somewhere (that is, the place written on the piece of paper has to be valid) and so they get compile errors when they mix values and pointers, and then "fix" it by changing around the use of & and * until the compiler stops complaining, at which point usually they are doing something other than what they intended and their program crashes when they run it. Notice here (in fly2) that though all the string constants are just passed around (and can be, because the compiler takes care of putting the characters somewhere) we need to explicitly make space to read the inputs into, and then once we've done that we can point at that space and have it work. A typical beginner mistake writing this code, though, is to write "char *name" instead of "char name[64]" -- that just declares a pointer, not an array, and it doesn't point anywhere in particular by default (it's a piece of paper the program picked up off the floor) so if you then try to read input into it, the address on the piece of paper doesn't exist and you crash. (Or sometimes, worse, it's the address of something else in the program and you overwrite that thing, which doesn't ever go well.)

Some other quick notes on the syntax in here:

"static" on a function or global variable means it isn't accessible from other source files; this isn't important until you have more than one source file.

The readstr function in fly3.c implements its own input editing (of the simplest possible form, backspaces only) because... you kinda need to once you're handling screen output explicitly.

"while (1) { ... }" is an infinite loop (the 1 is where the loop condition goes, and the 1 implicitly means 1 not equal to 0) but fortunately the "break" statement further down exits the loop.

#include imports declarations from the system libraries; by default almost nothing is defined (this is good, because it means you don't have to worry about name conflicts with system libraries you never heard of) and you have to import things to use them. <stdio.h>, <stdlib.h>, <string.h>, <ctype.h>, and <time.h> are from the C Standard Library; <unistd.h> and <err.h> are standard Unix addenda to the C Standard Library; and <curses.h> is the standard Unix terminal-window screen drawing library.

The -lcurses you need on the compiler command line also pulls in the curses library, at a different level ,and I'll explain the difference at some later date...


hopefully at least 10% of the above is comprehensible...
Attachments
fly.zip
(1.8 KiB) Downloaded 127 times

User avatar
Verbal
Posts: 3579
Joined: Fri Feb 01, 2008 9:04 pm
Location: Planet Bacterion

Re: Computer Programming in C

Postby Verbal » Tue Sep 21, 2021 7:57 pm

No.
"I'm putting an end to this f*ckery." - Rayna Boyanov

User avatar
ocelot
Posts: 689
Joined: Thu Jan 15, 2009 9:26 pm
Location: /bin/cat

Re: Computer Programming in C

Postby ocelot » Wed Aug 10, 2022 5:13 am

ok, so this was a complete failure.

try again, or forget it ever happened?

User avatar
Verbal
Posts: 3579
Joined: Fri Feb 01, 2008 9:04 pm
Location: Planet Bacterion

Re: Computer Programming in C

Postby Verbal » Wed Aug 10, 2022 7:00 pm

Okay.
"I'm putting an end to this f*ckery." - Rayna Boyanov

User avatar
3WE
Posts: 8226
Joined: Wed Feb 06, 2008 2:37 pm
Location: Flyover, America

Re: Computer Programming in C

Postby 3WE » Tue Aug 16, 2022 10:40 am

ok, so this was a complete failure.

try again, or forget it ever happened?
Ugh…I need to get reinspired….

Seems like 214 steps to do what 5 lines of BASIC or FORTRAN would do.
Commercial Pilot, Vandelay Industries, Inc., Plant Nutrient Division.

User avatar
3WE
Posts: 8226
Joined: Wed Feb 06, 2008 2:37 pm
Location: Flyover, America

Re: Computer Programming in C

Postby 3WE » Tue Aug 16, 2022 10:49 am

Can it delete and accidental double post?
Commercial Pilot, Vandelay Industries, Inc., Plant Nutrient Division.

User avatar
ocelot
Posts: 689
Joined: Thu Jan 15, 2009 9:26 pm
Location: /bin/cat

Re: Computer Programming in C

Postby ocelot » Sat Aug 20, 2022 8:25 am

Seems like 214 steps to do what 5 lines of BASIC or FORTRAN would do.
Kinda. Some things are more complicated, others are simpler. Reading input from the user is more complicated than just [tt]INPUT A$[/tt], and there are several reasons for that.

But there's also a cultural difference that's affecting it (and affects all simple intro stuff like this): in BASIC you do
[tt]LOAD "FLY.BAS"[/tt]
[tt]RUN[/tt]
and if you want it to work with anything user-specified you have to prompt for it and read it in.

Conversely in the Unix shell environment, which is where C came from, you don't do that for simple things; instead you give options and arguments when you run the program, and that eliminates most of the input handling, especially messy stuff like pruning newlines and extra spaces from the input. The canonical way you'd give your name to a program like this is something like
[tt]cc fly.c -o ./fly[/tt]
[tt]./fly ocelot[tt]
(There's no way to do that in BASIC, or at least not in traditional BASIC.)

It's probably a better idea to take up say Python first; Python has its own weird set of problems but it's a lot friendlier for getting started.

User avatar
Gabriel
Posts: 3692
Joined: Sat Feb 09, 2008 2:55 am
Location: Buenos Aires, Argentina

Re: Computer Programming in C

Postby Gabriel » Sat Aug 20, 2022 2:04 pm

Seems like 214 steps to do what 5 lines of BASIC or FORTRAN would do.
Kinda. Some things are more complicated, others are simpler. Reading input from the user is more complicated than just [tt]INPUT A$[/tt], and there are several reasons for that.

But there's also a cultural difference that's affecting it (and affects all simple intro stuff like this): in BASIC you do
[tt]LOAD "FLY.BAS"[/tt]
[tt]RUN[/tt]
and if you want it to work with anything user-specified you have to prompt for it and read it in.

Conversely in the Unix shell environment, which is where C came from, you don't do that for simple things; instead you give options and arguments when you run the program, and that eliminates most of the input handling, especially messy stuff like pruning newlines and extra spaces from the input. The canonical way you'd give your name to a program like this is something like
[tt]cc fly.c -o ./fly[/tt]
[tt]./fly ocelot[tt]
(There's no way to do that in BASIC, or at least not in traditional BASIC.)

It's probably a better idea to take up say Python first; Python has its own weird set of problems but it's a lot friendlier for getting started.
Sounds like LOGO, which is much more interesting that just the turtle dragging a pen. I don't remember the syntax but...

CRICLE [A]

REPEAT 360
FW A RT 1
REPEAT

Then A becomes a parameter of the program so when you execute for example CIRCLE 3 it will repeat 360 time forward 3 right 1.
In this way CIRCLE became a new instruction, not originally included in the language, but that now you can call in direct mode or from any other routine.

With tricks like that (and just for fun and practice, no practical application) I programmed a very simple BASIC in LOGO. The program would prompt you to write the line number and a command. The line number was in fact the name of a routing/program. PRINT, GOTO, INPUT were also names of routines that just executed the respective command in LOGO. RUN as also a program that would search for and execute program names starting from 1 and increasing 1, When it found the first one it would execute it and then search the next one. If the program was GOTO that would update the index so for example after GOTO 40 it would execute the program 40 and then search for 41, 42, etc...

User avatar
ocelot
Posts: 689
Joined: Thu Jan 15, 2009 9:26 pm
Location: /bin/cat

Re: Computer Programming in C

Postby ocelot » Sat Aug 20, 2022 9:09 pm

Sounds like LOGO, which is much more interesting that just the turtle dragging a pen. I don't remember the syntax but...

CRICLE [A]

REPEAT 360
FW A RT 1
REPEAT

Then A becomes a parameter of the program so when you execute for example CIRCLE 3 it will repeat 360 time forward 3 right 1.
In this way CIRCLE became a new instruction, not originally included in the language, but that now you can call in direct mode or from any other routine.
Yup. That's a procedure (or "function", the terms are effectively equivalent for all but doctrinal purposes): a chunk of code attached to a name that you can invoke later. BASIC has a primitive form of it: GOSUB 1000 jumps to line 1000 and then the next RETURN goes back to where it came from, but there's no facility for parameters, or for returning values to the caller when you're done.

In C all code exists in functions and [tt]main[/tt] is a reserved name for the function that's called when the program starts.

LOGO is a LISP relative and has a fairly strong notion of functions/procedures for a language of its era.
With tricks like that (and just for fun and practice, no practical application) I programmed a very simple BASIC in LOGO.
Ayup, that's how it's done :-)

User avatar
3WE
Posts: 8226
Joined: Wed Feb 06, 2008 2:37 pm
Location: Flyover, America

Re: Computer Programming in C

Postby 3WE » Sun Aug 21, 2022 10:02 am

You guys are scaring me…major Greek.
Commercial Pilot, Vandelay Industries, Inc., Plant Nutrient Division.

User avatar
ocelot
Posts: 689
Joined: Thu Jan 15, 2009 9:26 pm
Location: /bin/cat

Re: Computer Programming in C

Postby ocelot » Thu Sep 01, 2022 1:34 am

Next topic: beta reduction :mrgreen:

User avatar
3WE
Posts: 8226
Joined: Wed Feb 06, 2008 2:37 pm
Location: Flyover, America

Re: Computer Programming in C

Postby 3WE » Thu Oct 05, 2023 5:27 pm

Next topic: beta reduction :mrgreen:
No.

After looking at a lot of Youtubez, I found that I kind of like this guy.

There's just enough explanation, and it's geared for someone who has written basic (the adjective, not the language) computer programs before.

Sometimes he goes a bit crazy into overdrive, and it has been slow and painful. In spite of being OK at the SAS statistical package (in which one used to? write programs), I often forget the damn semicolon at the end of statements (a SAS requirement).

There definitely is a lot of mystery- setting up libraries at the start, the thing where you don't have to write std:: on every statement....weird stuff.

https://www.youtube.com/watch?v=6y0bp-mnYU0
Commercial Pilot, Vandelay Industries, Inc., Plant Nutrient Division.


Return to “Off Topic Forum”

Who is online

Users browsing this forum: No registered users and 0 guests