Why would you need to return it? You're passing by reference, which modifies the original. The data's already accessible outside the function, in the original.
Arrays don't work that way, anyhow; most compilers won't let you define an array with the size of a parameter. Those which would, don't always get it right...
---------- Post updated at 10:29 PM ---------- Previous update was at 08:06 PM ----------
To return new memory, you'll need to actually allocate new memory (and need to remember to free it later).
Code:
#include <stdio.h>
#include <stdlib.h>
// A 2d matrix structure that can be freed with an ordinary 'free'.
typedef struct arr2d
{
int r,c, **rows;
} arr2d;
arr2d *alloc_2d(int r, int c)
{
arr2d *array=NULL;
int *data, n;
size_t size=(r*c)*sizeof(int); // Room for r*c integers
size += sizeof(int *)*(r+1); // ...plus (r+1) int* pointers
size += sizeof(arr2d); // ...plus the structure itself
array=(arr2d *)malloc(size); // Now, actually allocate it
if(array==NULL) return(NULL); // Give up if out of mem
array->r=r; // Set up structure members
array->c=c;
array->rows=(int **)(array+1);
data=(int *)(array->rows+r+1);
for(n=0; n<r; n++) // Set up row pointers
{
array->rows[n]=data;
data+=c;
}
array->rows[r]=NULL; // Guard-pointer; insta-crash if we go beyond it
return(array);
}
void print_2d(const arr2d *array)
{
int r,c;
if(array == NULL) return; // don't print blank arrays
for(r=0; r<array->r; r++)
{
for(c=0; c<array->c; c++) printf("\t%d", array->rows[r][c]);
printf("\n");
}
printf("\n");
}
arr2d *multiply_2d(const arr2d *arr1, const arr2d *arr2)
{
int i, j, n;
arr2d *out;
// Don't operate on empty matrices
if((arr1==NULL)||(arr2==NULL)) return(NULL);
// Don't operate on arrays whose sizes don't match
if(arr1->c != arr2->r) return(NULL);
// Create new matrix to write to
out=alloc_2d(arr1->r, arr2->c);
for(i=0; i<out->r; i++)
for(j=0; j<out->c; j++)
for(n=0; n<arr2->r; n++)
out->rows[i][j] += arr1->rows[i][n] * arr2->rows[n][j];
return(out);
}
int main(void)
{
arr2d *arr1=alloc_2d(4, 3), *arr2=alloc_2d(3,2), *arr3=NULL;
arr1->rows[0][0]=14; arr1->rows[0][1]=9; arr1->rows[0][2]=3;
arr1->rows[1][0]=2; arr1->rows[1][1]=11; arr1->rows[1][2]=15;
arr1->rows[2][0]=0; arr1->rows[2][1]=12; arr1->rows[2][2]=17;
arr1->rows[3][0]=5; arr1->rows[3][1]=2; arr1->rows[3][2]=3;
arr2->rows[0][0]=12; arr2->rows[0][1]=25;
arr2->rows[1][0]=9; arr2->rows[1][1]=10;
arr2->rows[2][0]=8; arr2->rows[2][1]=5;
arr3=multiply_2d(arr1, arr2);
print_2d(arr1); print_2d(arr2); print_2d(arr3);
free(arr1); free(arr2); free(arr3);
}
Last edited by Corona688; 02-22-2012 at 01:06 AM..
I am trying to reference a two dimensional array in a
subroutine and can't seem to figure this one out in Perl.
Does anybody know? Please enlighten me.
#!/usr/bin/perl -w
use constant DIM => 4;
sub Shift_elements_right{
my (@Input, @Output) = @_;
for ($i = 0 ; $i <= DIM ;... (5 Replies)
I am going to develop a address book using the shell scripting commands without sed, awk, .... I am thinking to apply the concept of 2 dimenstional array. Can I create a two dimensional array for the insertion/updation/deletion of record in unix. If yes then tell me plz or recommend me some... (1 Reply)
I am trying to implementing two dimensinal array in ksh script.Would you pls help me out.
I have a large size of file, File contains looks like
ID SID VLAUE1 VALUE2 TOTALVALUE
1 a1 01 02 03
1 b1 02 05 07 ... (2 Replies)
Hi All,
I'm writing a nagios check that will see if our ldap servers are in sync...
I got the status data into a nested array, I would like to search key of each array and if "OK" is NOT present, echo other key=>values in the current array to a variable
so...eg...let take the single array... (1 Reply)
I cant get out of this while loop at the beginning of my program. Just reading from stdin one char at a time and storing it into a multi-array. Need to fix it with in two hours.
#include <sys/wait.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
#include... (1 Reply)
Hi.
I have a problem with passing two dimensional array to a function.
First, let me show my code to explain what i am going to do:
I have function:void initialize_board(char board);which is supposed to modify content of passed array. I have read here: Question 6.18 how such arrays should be... (3 Replies)
Hello, all
For a 1-dimensional array, such as
myarr_1=1
myarr_1=2
myarr_1=3I know I can write a loop as below to show the array member one by one:
for (i in myarr_1){print i, myarr_1}Now, suppose I have a two dimensional array such as:
myarray_2=1 myarray_2=2
myarray_2=10 myarray_2=20My... (3 Replies)
I have an array of names. Each one of the name, has a number represented to it.
For example A has an ID 8, B has an ID 2.
What I am after is a for loop that when the array is in position 1, a particular variable is set to the value of position 1 in array 2
declare -a arr=("A" "B" "C"... (6 Replies)
Hi,
I have a 10*10 two dimensional array. How do I assign value to all it's 100 elements at once? I don't want to open two for loops and assign one by one.
Thanks,
Shuri (1 Reply)
Discussion started by: shurimano
1 Replies
LEARN ABOUT DEBIAN
funtablerowget
funtablerowget(3) SAORD Documentation funtablerowget(3)NAME
FunTableRowGet - get Funtools rows
SYNOPSIS
#include <funtools.h>
void *FunTableRowGet(Fun fun, void *rows, int maxrow, char *plist,
int *nrow)
DESCRIPTION
The FunTableRowGet() routine retrieves rows from a Funtools binary table or raw event file, and places the values of columns selected by
FunColumnSelect() into an array of user structs. Selected column values are automatically converted to the specified user data type (and
to native data format) as necessary.
The first argument is the Fun handle associated with this row data. The second rows argument is the array of user structs into which the
selected columns will be stored. If NULL is passed, the routine will automatically allocate space for this array. (This includes proper
allocation of pointers within each struct, if the "@" pointer type is used in the selection of columns. Note that if you pass NULL in the
second argument, you should free this space using the standard free() system call when you are finished with the array of rows.) The third
maxrow argument specifies the maximum number of rows to be returned. Thus, if rows is allocated by the user, it should be at least of size
maxrow*sizeof(evstruct).
The fourth plist argument is a param list string. Currently, the keyword/value pair "mask=transparent" is supported in the plist argument.
If this string is passed in the call's plist argument, then all rows are passed back to the user (instead of just rows passing the filter).
This is only useful when FunColumnSelect() also is used to specify "$region" as a column to return for each row. In such a case, rows
found within a region have a returned region value greater than 0 (corresponding to the region id of the region in which they are located),
rows passing the filter but not in a region have region value of -1, and rows not passing any filter have region value of 0. Thus, using
"mask=transparent" and the returned region value, a program can process all rows and decide on an action based on whether a given row
passed the filter or not.
The final argument is a pointer to an int variable that will return the actual number of rows returned. The routine returns a pointer to
the array of stored rows, or NULL if there was an error. (This pointer will be the same as the second argument, if the latter is
non-NULL).
/* get rows -- let routine allocate the row array */
while( (buf = (Ev)FunTableRowGet(fun, NULL, MAXROW, NULL, &got)) ){
/* process all rows */
for(i=0; i<got; i++){
/* point to the i'th row */
ev = buf+i;
/* rearrange some values. etc. */
ev->energy = (ev->pi+ev->pha)/2.0;
ev->pha = -ev->pha;
ev->pi = -ev->pi;
}
/* write out this batch of rows */
FunTableRowPut(fun2, buf, got, 0, NULL);
/* free row data */
if( buf ) free(buf);
}
As shown above, successive calls to FunTableRowGet() will return the next set of rows from the input file until all rows have been read,
i.e., the routine behaves like sequential Unix I/O calls such as fread(). See evmerge example code for a more complete example.
Note that FunTableRowGet() also can be called as FunEventsGet(), for backward compatibility.
SEE ALSO
See funtools(7) for a list of Funtools help pages
version 1.4.2 January 2, 2008 funtablerowget(3)