MyString = Array("0です","1です","2です")

↑これの後ろに、"3です" を追加したいのですが、
どうしたらいいですか?

Perl で言う、Push関数の様なものが欲しいのですが。。

このQ&Aに関連する最新のQ&A

A 回答 (2件)

あとで追加する。

という事でしょうか?
だったら、普通に配列の数を増やして、そこに値を代入すればいいと思います。

手順は 
(1)UBound で配列の最大を取得してカウントを1加算する。
(2)求めたカウントで ReDim する。そのとき Preserve を使い配列の値の初期化を止める。
(3)配列に値を代入する。

という具合です。
ヘルプで UBound、ReDim を調べればすぐコーディングできると思います。
できなかったら↓↓参考にしてください。

Private Sub Command1_Click()

Dim MyString As Variant
Dim lCnt As Long

MyString = Array("0です", "1です", "2です")

lCnt = UBound(MyString) + 1
ReDim Preserve MyString(lCnt)
MyString(lCnt) = "3です"


End Sub
    • good
    • 0
この回答へのお礼

お時間を割いて答えて下さり、
ありがとうございます。

やっぱり ReDim Preserve するしかないんでしょうか。

Perl の Push関数は

Push(配列名,文字列);

という、
あえて配列のサイズを指定する必要のない、
とても簡単なものだったので、
そういう関数があるかなぁ?と思ったのですが。 (T-T)

お礼日時:2001/07/02 10:19

前に一度そういうの探した事があったんですけど、めぼしいものが見つかりませんでした。

あると便利なんですけどね。
    • good
    • 0
この回答へのお礼

ReDim で進めてみます。
お手数を取らせまして、申し訳ありません。

ありがとうございました。

また、何かありましたら
よろしくお願いいたします。( ̄∇ ̄)

お礼日時:2001/07/02 15:34

このQ&Aに関連する人気のQ&A

Perl 関数」に関するQ&A: PHPとPerlの違い

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QCなどで要素の数が固定できない配列はどうやって実現しますか?

配列について質問します。

BASIC系では配列は動的配列で要素の数が自由に変えられます。
ですが、C等では宣言時に配列の要素の数を決めておかねばならなかったと思います。
もし、C等で要素の数がわからないけど、配列を使いたい場合、どうすればいいのでしょうか?
どのように実現するのでしょうか?
配列と同じ使い勝手なら配列でなくともかまいません。

今はVBAでプログラムを組んでいるので、動的配列を使えばすむのですが、いずれ他の言語に移植したいので、できるだけ使わないようにしたいと思っています。

よろしくお願いいたします。

Aベストアンサー

malloc等のメモリ確保はNo.1さんの回答のリンクが詳しいですね。
C言語でプログラムを組む場合は、大抵はこれらメモリ操作関数のお世話になります。

これに加えて、C++やJavaのライブラリでは、動的配列クラスというものが使えます。
C++だとvectorやlist、JavaだとVectorやArrayListあたりですね。
他にも、言語や環境に依存したライブラリ、フレームワークで
様々な動的配列の機構が用意されていたりします。

簡単にまとめると、
・malloc、free、realloc等を使う方法 → ReDim
・動的配列クラス → Collection
のようなものだと考えてください。

QVB6変数の宣言dim j,k,p,m,n as Integerは良くない?

お世話になります。

VB暦1年です。

汎用の変数宣言でタイトルのように
dim j,k,p,m,n as Integer
dim ssa,ssb as String

など、カンマ区切りで変数宣言を使っていたのですが
最近、知人にasの手前の変数は型どおり宣言されるが
その手前の変数はVariant型で宣言されてしまうと指摘されました。

指摘されるまで気にはしていませんでしたが
ウォッチで確認すると変数に代入されるまでは
型がVariant/Emptyとなってます。

以後、気をつければいいのですが
過去にコーディングしたプログラムにも多少、使用していて客先に納品してしまっているものもあります。
後々、問題になるのかな?

Aベストアンサー

おっしゃる通り、カンマで区切る場合は、
Dim j As Integer, k As Integer, p As Integer
という風にすべてAsで型を明示しないと、
Variant型になってしまいます。
つまり、
Dim j
Dim k
Dim p As Integer
とわけて書いた場合と同じです。
(VB.NETは、
Dim j, k, p As Integer
で全部Integerになるようなので、ややこしいですね)

すでにご存知とも思いますが、一般的にVariant型を多用しているコードは、宣言を見ても、どういう種類の値を使うかわかりづらいですし、比較対象の型を誤るというようなバグの原因になりやすいので、型を明示できるような状況で敢えてVariant型を使うべきではないです。

しかし、すでに納品してしまったコードについては、問題はメモリを余計に使ってしまうことくらいではないでしょうか?
他の人が気づかなかったことから考えるに、多分狭いスコープで使っていますよね? 比較対象や代入するべき型を誤るというようなロジックの誤りがない限り、少なくとも動作上の問題は発生しないと思います。ただ、直せる機会があるのであれば、直した方がいいとは思いますが。

おっしゃる通り、カンマで区切る場合は、
Dim j As Integer, k As Integer, p As Integer
という風にすべてAsで型を明示しないと、
Variant型になってしまいます。
つまり、
Dim j
Dim k
Dim p As Integer
とわけて書いた場合と同じです。
(VB.NETは、
Dim j, k, p As Integer
で全部Integerになるようなので、ややこしいですね)

すでにご存知とも思いますが、一般的にVariant型を多用しているコードは、宣言を見ても、どういう種類の値を使うかわかりづらいですし、比較対象の型を誤るというよう...続きを読む

QC#かJavaで、配列の中から別の配列を探し出す

お世話になります。

C#かJava(CやC++は入れない)で、特定の配列の中に、該当する
配列があるかどうかを調べるメソッドがあれば、教えてください。

例えば…

int[] a={0,0,0,1,2,3,4,5,6,7};
int[] b={3,4,5};

ならば、『5』が返ってくるなどです。

力技では、aの配列を順にみていき、bの一番目と同じなら、
お互いの配列の次の要素を比較…などとやっていくのですが、
これらの方法を、標準のメソッドがあれば…と思い、
質問させていただきました。

以上、よろしくお願いいたします。

Aベストアンサー

Javaだけの話です。(以下、indexはbの添字)
int型配列aに含まれるint型配列bの要素の先頭の添字だけ欲しい場合
Arrays.binarySearch(a,b[index]);
int型配列aに含まれるint型配列bの要素の全添字欲しい場合
Arrays.binarySearch(a,from,to,b[index]);//from,toは配列aの走査対象要素

配列がオブジェクト型でもいいなら、Listを実装したクラス(ArrayListなど)に放り込みます。

オブジェクト型配列aに含まれるオブジェクト型配列bの要素があるか否か
listA.contains(b[index]);
オブジェクト型配列aに含まれるオブジェクト型配列bの要素の先頭の添字だけ欲しい場合
listA.indexOf(b[index]);
オブジェクト型配列aに含まれるオブジェクト型配列bの要素の最後の添字だけ欲しい場合
listA.lastIndexOf(b[index]);

最初に見つかる添字だけ欲しいなら標準ライブラリで取得できますが、
全添字が欲しいとなると途端に泥臭くなります。

Javaだけの話です。(以下、indexはbの添字)
int型配列aに含まれるint型配列bの要素の先頭の添字だけ欲しい場合
Arrays.binarySearch(a,b[index]);
int型配列aに含まれるint型配列bの要素の全添字欲しい場合
Arrays.binarySearch(a,from,to,b[index]);//from,toは配列aの走査対象要素

配列がオブジェクト型でもいいなら、Listを実装したクラス(ArrayListなど)に放り込みます。

オブジェクト型配列aに含まれるオブジェクト型配列bの要素があるか否か
listA.contains(b[index]);
オブジェクト型配列aに含まれるオ...続きを読む

Qファイル内の(&H0A)を(&H0D0A)に変換したい

改行コードが0A(16進数)となってしまっているファイルを
0D0A(16進数)に変換したいのですが、どのような方法がありますか?
出来れば時間の掛からない方法が知りたいです。

ファイルは、ヤマト運輸の着店コードファイルで件数が3000件ほどあるのですが
改行コードが0AなのでInput#で読み込めません。

ファイルを変更しなくても良い方法があればそれでも結構です。

Aベストアンサー

置き換えてファイルの保存をしたかったのですね・・・

それと、やはり読み込まない事には、置き換えれないですよ。
だって読んでないんだもん・・・


んで、置き換えで保存するのに一番早いのは#2に書いてあるようにまず
「GETで読む」
「Replace関数で置き換える」← 一度でファイル内の文字列を変換できます(VB6仕様)
「PUTでファイルに落とす」
これをファイルの数だけ繰り返す処理になると思います。

大まかにわけると、たった3つの処理で済みます。

QC言語の2次元配列 容量が大きすぎる場合の対処方法

私はC言語をもちいて2次元配列を作ろうとしています。

しかし、配列数が double c[10000][10000];
と大きいものにすると、エラーになってしまいます。

もちろん小さい double c[10][10];
のような配列では問題ありません。

malloc関数とかも調べたのですがなかなかいい文献が見つからずに
困っています。
どうかいいご意見があればよろしくお願いします。

Aベストアンサー

No.5です。
>今はa[],b[]に10000個の配列があります。これをc[a][b]に格納するためにどうするか、例文を書いていただいてもよろしいでしょうか?

例文ではありませんが、感じだけ書きましたので参考にしてください。
パラメタの順序や型は正しくないと思いますので、各関数はよく調べて使ってください。あくまで、こんな感じ、ということです。
-------------------
#include <stdio.h>
#include <io.h>

double read_c(FILE *fp, int x, int y) {
 double c;
 fseek(fp,(x*10000+y)*8L, SEEK_SET);
 fread(&c, 1,8, fp);
 return c;
}

void write_c(FILE *fp, double *c, int x, int y) {
 fseek(fp,(x*10000+y)*8L, SEEK_SET);
 fwrite(c, 1,8, fp);
}

int main(void)
{
 FILE *fp;
 double c,s;
 int x,y;
 int a[10000],b[10000];
 
 fp = fopen("c.dat","w+b");// double c[10000][10000]; の意味
 
 for(x=0; x<10000; x++) {
  for(y=0; y<10000; y++) {
   c=a[x]*b[y];
   write_c(fp, &c, x,y);// c[x][y]=a[x]*b[y]; の意味
  }
 }
 
 for(x=0; x<10000; x++) {
  s=0;
  for(y=0; y<10000; y++) {
   s += read_c(fp, x,y);// s += c[x][y]; の意味
  }
  b[x] = s / 10000;
 }
 
 fclose(fp);
 return 0;
}

No.5です。
>今はa[],b[]に10000個の配列があります。これをc[a][b]に格納するためにどうするか、例文を書いていただいてもよろしいでしょうか?

例文ではありませんが、感じだけ書きましたので参考にしてください。
パラメタの順序や型は正しくないと思いますので、各関数はよく調べて使ってください。あくまで、こんな感じ、ということです。
-------------------
#include <stdio.h>
#include <io.h>

double read_c(FILE *fp, int x, int y) {
 double c;
 fseek(fp,(x*10000+y)*8L, SEEK_SET);...続きを読む

Q座標A(X,Y)の線分(aX,aY)(bX,bY)に対称な座標の求め方

VBで図形を入力した線分に対称に反転した図形と書こうとしています。
その為に必要な座標A(X,Y)の線分(aX,aY)(bX,bY)に対称な
座標B(X',Y')の求め方についてご教授お願いいたします。

Aベストアンサー

 次の関係から連立方程式を解いてください。

 点P(aX,aY)、点Q(bX,bY)とすると、

・直線PQと直線ABは垂直に交わる。 ⇒2つの直線の傾きを掛けると-1になる。

・2点ABの中点Mが直線PQ上を通る。⇒直線PQの方程式に点M((X+X')/2, (Y+Y')/2)を代入する。

Qc言語の配列の先頭アドレスが偶数アドレスとなる理由について

c言語の配列の先頭アドレスが偶数アドレスとなる理由について

下記のように実行結果をで見ると、配列Sの先頭アドレスと配列Cの先頭アドレス共に偶数アドレスなる理由を教えて頂きたい。

/*list0105*/
#include <stdio.h>
main()
{

char na=1;
char nb=1;
char c[2] ={1,2};
char s[3] = {1,2,3};
char nc=1;
char nd=1;

printf("%p\n",&na);
printf("%p\n",&nb);
printf("%p %p \n", &c[0],&c[1] );
printf("%p %p %p \n", &s[0],&s[1] ,&s[2] );
printf("%p\n",&nc);
printf("%p\n",&nd);


}

実行結果
0xbffff8cf
0xbffff8ce
0xbffff8cc 0xbffff8cd ← c配列
0xbffff8b0 0xbffff8b1 0xbffff8b2 ← S配列
0xbffff8af
0xbffff8ae

c言語の配列の先頭アドレスが偶数アドレスとなる理由について

下記のように実行結果をで見ると、配列Sの先頭アドレスと配列Cの先頭アドレス共に偶数アドレスなる理由を教えて頂きたい。

/*list0105*/
#include <stdio.h>
main()
{

char na=1;
char nb=1;
char c[2] ={1,2};
char s[3] = {1,2,3};
char nc=1;
char nd=1;

printf("%p\n",&na);
printf("%p\n",&nb);
printf("%p %p \n", &c[0],&c[1] );
printf("%p %p %p \n", &s[0],&s[1] ,&s[2] );
pr...続きを読む

Aベストアンサー

メモリの配置はコンパイラとコンパイルオプションに依存します。
デフォルトだと、32ビットのメモリ処理単位=4バイトとか8バイトが多いかと。
理由は32ビットCPUが4バイト単位でメモリにアクセスするのでアクセス効率を優先したためです。

例えば、
0xbffff8cc 0xbffff8cd ← c配列
0xbffff8ce 0xbffff8cf 0xbffff8d0 ← S配列
だとしたら、S配列の内容全てを参照するためにCPUは0xbffff8ccと0xbffff8d0の合計8バイトにアクセスする必要が出てきます。無駄ですよね。

Q算術記号(+,-,/,*)を文字としてあらわして計算に使用する方法

ビジュアルベーシック初心者です。
タイトルでは誤解をうむと思いますが、やりたいことは以下のようなことです。

kigouという変数をstringsで宣言しそこに文字として算術記号を代入する。  例 kigou = "+"

このkigou変数を用いて、実際の計算をする。
例 i = 1 kigou 2
この場合、kigou変数には+が代入されているので、iの値は3になる。

このように、kigouに入れる算術記号を任意にかえ、kigouという変数を用いて実際の計算をさせたいのですが、正しい記述方法などがわかりません。方法はありますか?

Aベストアンサー

#3です。
プログラムは、どれだけ多く使われるかによって、作るのにどれだけ手間をかけてもよいか、が決まるものです。例えば、それだけの需要があれば、次のようなプログラムを作っても採算がとれるはずです。

例えば、
keisan (2, +, 3) よりも一歩進めて、keisan ("(2 + 3) * 4") の値が 20 となるような function keisan を作ることは可能です。中級者以上の練習問題に適していると思います。

QC言語でunsigned char配列を連結する方法ってありますか?

C言語でunsigned char配列を連結する方法ってありますか?

例えば
unsigned char test[]={0x00,0x02,0x03};
unsigned char test2[]={0x05,0x06};
という配列があったとして

test[]という配列のあとにtest2の配列を追加することは可能でしょうか?
{0x00,0x02,0x03,0x05,0x06}という配列になればOKです。

よろしくお願いします。

Aベストアンサー

testの領域は3バイトのため、それ以上の配列を追加することは出来ません。
もし、testのサイズが5バイト以上あれば、test2を追加することは、できます。
その場合は、memcpy(&test[3],test2,2); とすれば、
testの4バイト目からあとに、test2の2バイトが追加されます。
新たに配列を作成して良いなら、
unsigned char test3[5];として
memcpy(test3,test,3);
memcpy(&test3[3],test2,2);
とすれば、test3はtestとtest2を連結したものとなります。

Qエクセル VBA arrayについて

arrayの使い方についてご教授をお願いします。

以下の記述はワークシートが3枚あり、それぞれの最終行を調べ、arrayに読み込んでいます。いつもは変数を3つ設定しシート毎に各変数にセットしているのですが、以下の簡単な記述を知る機会があり勉強をしています。なぜ各シートをループし、その都度ちゃんと最終行を読込んでいるのか教えて頂きたいと思います。
また他のホームページで解説等を見ると、最初からarrayの( )の中に複数の文字等が並んでおり、それを取出す使い方が書いてありますが、このように検索結果をarrayに読込む場合の( )の中は0を入れて置けばよいのでしょうか?
初心者のため、わかりずらい文で申し訳ありません。エクセル2000を使用しています。


Sub kk()
Dim lastrow As Variant
lastrow = Array(0, 0, 0, 0, 0)
For m = 1 To 3
n = 1
Do While Sheets(m).Cells(n, 1) <> ""
n = n + 1
Loop
MsgBox n - 1
lastrow(m) = n - 1
Next
End Sub


最終行の取得方法は他にもある事は理解しています。よろしくお願いします。

arrayの使い方についてご教授をお願いします。

以下の記述はワークシートが3枚あり、それぞれの最終行を調べ、arrayに読み込んでいます。いつもは変数を3つ設定しシート毎に各変数にセットしているのですが、以下の簡単な記述を知る機会があり勉強をしています。なぜ各シートをループし、その都度ちゃんと最終行を読込んでいるのか教えて頂きたいと思います。
また他のホームページで解説等を見ると、最初からarrayの( )の中に複数の文字等が並んでおり、それを取出す使い方が書いてありますが、このように...続きを読む

Aベストアンサー

Sub kk()
  Dim lastrow As Variant
  Dim m As Long
  Dim n As Long

  lastrow = Array(0, 0, 0, 0, 0)
  For m = 1 To 3
    n = 1
    Do While Sheets(m).Cells(n, 1) <> ""
      n = n + 1
    Loop
    lastrow(m) = n - 1
  Next
Stop 'Stopステートメント
End Sub

上記 Sub kk() を実行すると Stopステートメント で中断します。
VBE画面で[Alt][v][s]。
[ローカルウィンドウ]が表示されます。
[ローカルウィンドウ]は変数の中身を確認するのに便利なツールです。
 + lastrow
の表示の+をクリックすると内容を展開できます。
lastrow(0) 0
lastrow(1) ??
lastrow(2) ??
lastrow(3) ??
lastrow(4) 0

これで1次元の配列変数lastrowの1要素目に 0、2要素目に??、(略)5要素目に0、
が入っている事がわかります。

最初に
Dim lastrow As Variant
変数lastrowをVariant型で宣言しています。
Variant型は何でもはいりますから
lastrow = Array(0, 0, 0, 0, 0)
この時に要素が5つの1次元配列を代入してます。
各シートの最終行を格納する配列変数を準備してるわけですね。

この処理は必要なのでしょうか。
以下試してみてください。

Sub ll()
  Dim lastrow(1 To 3) As Long
  Dim m As Long

Stop '※1
  For m = 1 To 3
    lastrow(m) = Sheets(m).Cells(Rows.Count, 1).End(xlUp).Row
  Next
Stop
End Sub

最初の※1で(0,0,0)の配列が準備できています。
Dim lastrow(1 To 3) As Long で
「Array関数による初期値0の配列の準備」と同じ事ができます。
また、

Sub mm()
  Dim lastrow() As Long
  Dim n As Long
  Dim i As Long
  
  n = Worksheets.Count
  ReDim lastrow(1 To n)
Stop
  For i = 1 To n
    lastrow(i) = Worksheets(i).Cells(Rows.Count, 1).End(xlUp).Row
  Next
Stop
End Sub

このようにWorksheets.Countに対応する要素数の配列を設定する事もできます。
なので、Array関数を使うより、最初に「ある要素数の配列を準備」すると
初期値に何もはいっていない配列(容れ物)として使う事ができます。
#Long型の配列は初期値は 0 で
#Variant型の配列は初期値は Empty になります。



Array関数は、例えば
Sub nn()
  Range("A1").Resize(, 5).Value = Array(2, 4, 6, 8, 10)
End Sub
このようにセル範囲に配列の値をまとめて入力したり、
ListBoxやComboBoxに配列の値をまとめてセットしたりする時に使うと便利です。

Sub kk()
  Dim lastrow As Variant
  Dim m As Long
  Dim n As Long

  lastrow = Array(0, 0, 0, 0, 0)
  For m = 1 To 3
    n = 1
    Do While Sheets(m).Cells(n, 1) <> ""
      n = n + 1
    Loop
    lastrow(m) = n - 1
  Next
Stop 'Stopステートメント
End Sub

上記 Sub kk() を実行すると Stopステートメント で中断します。
VBE画面で[Alt][v][s]。
[ローカルウィンドウ]が表示されます。
[ローカルウィンドウ]は変数の中身を確認するのに便利なツールです。
...続きを読む


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング

おすすめ情報