• Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 360
  • Last Modified:

How can I define two dimentional SAFEARRAY?

How can I define two dimentional SAFEARRAY of type integer?
0
MohdAsalah
Asked:
MohdAsalah
  • 4
  • 4
  • 3
  • +3
1 Solution
 
markvpCommented:
Could you be more specific about what you're trying to do? Do you simply want to define a two dimensional array or define a type? Are the dimensions known at compile time?

Normally you define it as

     int a[10][10];
     a[5][6] = 14;

You can also typedef it for convenience:

     typedef int safearray[10][10];
     safearray a;
     a[5][6] = 14;

If the dimensions are not known at compile time, it's more difficult.
0
 
IainHereCommented:
I assume you're talking COM.  Well, you use SafeAffayCreate (look in MSDN library).  There's an example here
http://support.microsoft.com/support/kb/articles/Q182/8/31.ASP
(using VT_VARIANT - you'll have to use VT_UI1 for ints).

Have a look here, too:
http://community.borland.com/article/0,1410,22016,00.html

you should have something like this.
<altered version of that MSDN link>
SAFEARRAY FAR* psa;
SAFEARRAYBOUND rgsabound[2];
rgsabound[0].lLbound = 0;
rgsabound[0].cElements = 3;
rgsabound[1].lLbound = 0;
rgsabound[1].cElements = 3;
psa = SafeArrayCreate(VT_UI1, 2, rgsabound);
0
 
danelroismanCommented:
//like int arr[8][4];

HRESULT hres;
SAFEARRAY * psaiNew;
SAFEARRAYBOUND aDim[2];

aDim[0].lLbound = 0;
aDim[0].cElements = 7;
aDim[1].lLbound = 0;
aDim[1].cElements = 3;

psaiNew = SafeArrayCreate(VT_I2, 2, aDim);
if (psaiNew == NULL) throw ERROR_NOT_ENOUGH_MEMORY;
     
//use array ....
//.....


//destroy!
if (hres = SafeArrayDestroy(psaiNew)) throw hres;
0
Cloud Class® Course: Amazon Web Services - Basic

Are you thinking about creating an Amazon Web Services account for your business? Not sure where to start? In this course you’ll get an overview of the history of AWS and take a tour of their user interface.

 
MohdAsalahAuthor Commented:
That's fine but how can I fill this array ,I mean how can I use SafeArrayPutElement API function in this two dimentional array.
0
 
MohdAsalahAuthor Commented:
That's fine but how can I fill this array ,I mean how can I use SafeArrayPutElement API function in this two dimentional array.
0
 
danelroismanCommented:
//like int arr[8][4];

HRESULT hres;
SAFEARRAY * psaiNew;
SAFEARRAYBOUND aDim[2];

aDim[0].lLbound = 0;
aDim[0].cElements = 7;
aDim[1].lLbound = 0;
aDim[1].cElements = 3;

psaiNew = SafeArrayCreate(VT_I2, 2, aDim);
if (psaiNew == NULL) throw ERROR_NOT_ENOUGH_MEMORY;
     
//use array ....
//.....


//destroy!
if (hres = SafeArrayDestroy(psaiNew)) throw hres;
0
 
danelroismanCommented:
for(long i =0; i < 4; i++)
{
for(long j=0; j < 8; j++)
{
int  someVal = 4; //some value
//j means dimension              
::SafeArrayPutElement(psaiNew,&j, &someVal);
}
}
0
 
danelroismanCommented:
Sorrry, the previows example was realy bad. :)

This example populates the safearray elements with double values. (Using MFC)

VARIANT _stdcall retVariantArray(void)
{
  COleSafeArray saRet;        
  DWORD numElements[] = {10, 10}; // 10x10

  // Create the two dimensional safe-array of type VT_R8 with size 10x10.
  saRet.Create(VT_R8, 2, numElements);

  // Initialize safearray with values...
  long index[2];
  for(index[0]=0; index[0]<10; index[0]++)
  {
    for(index[1]=0; index[1]<10; index[1]++)
     {
      double val = index[0] + index[1]*10;
      saRet.PutElement(index, &val);
    }
  }
  // Return the safe-array encapsulated in a VARIANT...
  return saRet.Detach();
}

0
 
IainHereCommented:
>>How can I define two dimentional SAFEARRAY of type integer?

... solution ...


>> That's fine but how can I fill this array?

Normally this would be a different question, especially if the original question is 5 times easier than an easy question.  Please don't take this the wrong way - I'm just giving my opinion.
0
 
MohdAsalahAuthor Commented:
This Comment to lainHere:

If the first question is 5 times easier than an easy question why u do not complete ur answer.
and please keep your opinion to yourself.
0
 
IainHereCommented:
Interesting.  As you will have been advised when you asked the question, 50 points = easy question; 100 points = moderate question; 200 points = difficult question.

>> If the first question is 5 times easier than an easy question
I was referring to the number of points you put up.  10 points = 1/5 of easy question.

>> why u do not complete ur answer.
I did.  You will notice that the SafeArrayCreate function call I made did what you asked in your original question.

>>keep your opinion to yourself.
>>Please don't take this the wrong way
:-)
0
 
MohdAsalahAuthor Commented:
That is very silly,I do not put 10 points because this <comment edited by Community Support> question is very easy but because I just have 10 points.
<comment edited by Community Support> .
0
 
Kyle SchroederEndpoint EngineerCommented:
where is "the" hell?
0
 
Lab1Commented:
MohdAsalah We do not allow profanity or flaming here at EE. Please keep your comments professional.
Thank you
Lab1
CS Moderator
0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

Join & Write a Comment

Featured Post

Introducing Cloud Class® training courses

Tech changes fast. You can learn faster. That’s why we’re bringing professional training courses to Experts Exchange. With a subscription, you can access all the Cloud Class® courses to expand your education, prep for certifications, and get top-notch instructions.

  • 4
  • 4
  • 3
  • +3
Tackle projects and never again get stuck behind a technical roadblock.
Join Now