私のおもちゃ箱-プログラミングテキスト


プログラミング何でも掲示板(過去分)
私のおもちゃ箱
 −−プログラミングテキスト−−
<> フローチャート
<> ハードウェア
<> C言語 (C language)
<> Visual Basic 2005
<> Visual Basic 6.0
<> COMETU & CASLU
<> JavaScript
<> HSP 3.0
<> Windows Xp
  Word2000, Excel2000,PowerPoint2002
<> ホームページ作成

過去ログ
メニューに戻る


CASLUです。  りん - 2008/01/02(Wed) 08:59 No.221

去年はお世話になりました。
今年も早速質問なのですが、お力をお貸しください。

次のプログラムのSUMがコールされる前のGR1とGR2、
コールコールされたあとのGR0の役割、

SUM内におけるGR0とGR7の役割、
SUM内において、GR1、GR7をPUSH、POPする理由、

サブルーチンSUMの機能、

さらに、ここからの方が難題なんですが、
次のプログラムに、
指定された整数値配列の中から最大値を調べるサブルーチンMAXを作成する、
指定された整数値配列の中から最小値を調べるサブルーチンMAXを作成する、
指定された整数値配列を昇順にソートするサブルーチンSORTを作成する、
指定された整数値配列の平均値(整数値)を調べるサブルーチンAVEを作成する、

以上です、よろしくお願いします!!



PGM START
LAD GR1, DATA
LD GR2, =10
CALL SUM
ST GR0, RESULT
RET
DATA DC 1,9,3,7,5,10,2,8,4,6
RESULT DS 1
END
SUM START
PUSH 0, GR1
PUSH 0, GR7
LD GR0, =0
LD GR7, =0
MAIN CPA GR7, GR2
JZE QUIT
ADDA GR0, 0, GR1
LAD GR1, 1, GR1
LAD GR7, 1, GR7
JUMP MAIN
QUIT POP GR7
POP GR1
RET
END

Re: CASLUです。  hiroshi - 2008/01/03(Thu) 02:32 No.222

ようこそ、りん さん
ひょっとして、冬季の課題? とりあえず・・・
GR1はデータの先頭番地、SUMをコールするとGR1が1ずつ加算されてデータが参照できる。
GR2はデータの個数、ラベルMAINで個数を比較しています。
コール後のGR0はデータの合計が格納されています。サブルーチンの名前がSUMですから
名前から予想できますよね。
さて、次の4つの課題ですが、プログラムの作成はお受けしておりません。
最大値と最小値に関しては私のサイトの次のページが参考になると思います。
http://masudahp.web.fc2.com/casl2/casl2230.html
ソートについては言語が違いますが、次のページを参考にして考えてみてください。
http://masudahp.web.fc2.com/hsp30/kiso/hspk034.html
平均値については、合計値をデータの個数でわり算すると求められますが、CASLには
わり算の命令がありませんので、「合計値からデータの個数が何回減算できるか」という
形でプログラムを考えるといいと思います。
それでは、またいつでもどうぞ。


CASLU  ぷう - 2007/12/25(Tue) 18:13 No.215

はじめまして。

REP3 START
LAD GR0,1
LAD GR1,1
@ GR2,LEN
LOOP SUBA GR2,=1
A  FIN
ST B
SLL C
SLA GR1,1
JUMP LOOP
FIN RET
ANS D 5
LEN E 5
END
このプログラムを実行すると、ANS番地からの5語に、以下のようなビットパターンが格納される。

ANS+0番地 1000000000000000
ANS+1番地 0000000010000000
ANS+2番地 0000000000001000
ANS+3番地 0000000000000010
ANS+4番地 0000000000000001

このとき、@〜Eの空欄に適切な命令コードやオペランドを入れて、プログラムを完成させなさい。

という問題です。
私の考えでは、AJIM、DDS、EDCだと思うのですが、それ以外がまったくわかりません。
教えていただけないでしょうか?よろしくお願いします。

Re: CASLU  hiroshi - 2007/12/27(Thu) 04:00 No.217

ようこそ ぷうさん
早速ですが、ADEはその通りですね。
@は、GR2に繰り返しの回数5を格納するのですから、LD命令です。
使われているレジスタはGR0,GR1,GR2の3つです。
Bは、メモリに格納するST命令ですから、何かをANS番地以降に格納するのでしょう。
ですから、「ST GRn, ANS, GRm」という形になるはずです。
ANS+0,ANS+1,ANS+2,ANS+3,ANS+4番地に格納するわけですが、+0,+1,+2,+3,+4が GRm に相当します。
0,1,2,3,4と値が増えるレジスタはありません。GR0,GR1ともに初期値が1なので、GR2と
考えると、GR2は4,3,2,1,0と変わっていくので、ANS+4,ANS+3,ANS+2,ANS+1,ANS+0の順に
格納していくようです。ということで、「ST GRn, ANS, GR2」となります。次に、GRn は
GR0かGR1だろうと見当を付けます。実行結果はANS+4番地から2,8,128,…ですが、
GR1は「SLA GR1, 1」で2,4,8,16,…と変化します。直前の「SLL C」が「SLL GR1,1」としても4,16,…となり結果とあいませんしGR0は不要となります。
したがってGRnはGR0と考えるのが自然です。
ということで、Bは「ST GR0, ANS, GR2」となります。
CではGR0に対して演算しなければGR0の値は変化しませんので、「SLL GR0, ○」と考えられます。
○の部分でシフトするビット数を指定します。実行結果から1,2,4,8ビットシフトさせることがわかります。
ちょうどGR1の値が同じように変化します。ということで、「SLL GR0, 0, GR1」となります。

以上ですが、どうでしょうか。
それでは、またいつでもどうぞ。

Re: CASLU  ぷう - 2007/12/29(Sat) 00:20 No.219

hiroshi様

とてもわかりやすい説明をありがとうございます。
GR0をどう使うのかが、思い浮かばなくて全然わからなかったんですけど
hiroshiさんの説明で、理解できました。

本当にありがとうございましたm(__)m ペコ

C言語です。  りん - 2007/12/27(Thu) 03:19 No.216

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define dBufferSize (32768)
#define dPrintFmt "#d: %s\n"

typedef struct _NODE NODE;
struct _NODE {
char *line;
NODE *next;
};

int RemoveReturnCode(char *string);
NODE *MakeNode(char *string);
int FreeNodeList(NODE *node);
void FreeNode(NODE *node);
int PrintNoceList(NODE *node);
NODE *ReverseNodeList(NODE **head);

int main(void){
char buffer[dBufferSize];
NODE *head = NULL;

while (fgets(buffer, dBufferSize, stdin) != NULL){
NODE *pivot;

RemoveReturnCode(buffer);
pivot = MakeNode(buffer);
if (pivot == NULL) return FreeNodeList(head);
pivot->next = head;
head =pivot;
}
PrintNodeList(head);
ReverseNodelist(&head);
PrintNodeList(head);
FreeNodeList(head);

return 0;
}

int RemoveReturnCode(char *str){
char *p;

if (str == NULL) return -1;
for (p = str; *p != '\n' && *p != '\r' && *p != '\0'; p++)
;
*p = '\0';

return p - str;
}

NODE *MakeNode(char *str){
NODE *node;

if(str == NULL)return NULL;

node = (NODE *)calloc(1,sizeof(NODE));
if(node != NULL){
char *p = (char *)calloc(strlen(str)+1, sizeof(char));

if (p != NULL){
node->line = strcpy(p, str);
node->next = NULL;
}
else{
free(node);
node = NULL;
}
}

return node;
}

int FreeNodeList(NODE *node){
int ct = 0;

while (node != NULL){
NODE *next = node->next;

FreeNode(node);
ct++;
node = next;
}

return ct;
}

void FreeNode(NODE *node){
free(node->line);
free(node);
}

int PrintNodeList(NODE *node){
int ct;

for (ct = 0; node != NULL; node = node->next, ct++)
printf(dPrintFmt, ct+1, node->line);

return ct;
}

NODE *ReverseNodeList(NODE **head){
NODE *reverse = NULL;
NODE *node = *head;

while (node != NULL){
NODE *next = node->next;

node->next = reverse;
reverse = node;
node = next;
}

return *head = reverse;
}



このプログラミングを解読したいのですが・・・
できれば、関数ごとに調べて、そこから全体をみわたせると
ワタシなんかの頭でも理解できるかと思うので、
助けていただけますでしょうか??
それとも図とか例示のほうが理解しやすいのかなぁ。。 

動的確保をつかってて、スタックのリスト版だということは
わかっています。

いつも本当におせわになっています。
よろしくお願いします!!

あ、あとボトムアップっていう単語って存在しますか??苦笑



Re: C言語です。  hiroshi - 2007/12/27(Thu) 05:20 No.218

ようこそ りんさん
そうですね、関数ごとにトレースすることとデータがどのように格納されていくかを考えれば
いいと思います。とりあえず、トレースするための手がかりだけ

各関数の概要
int RemoveReturnCode(char *string);
 改行文字などをナル文字(\0)に置き換える。
 返却値はナル文字までの文字数。
NODE *MakeNode(char *string);
 新規にノードを作成する。ノードには1行分の文字列と次のノードのアドレスが格納される。
 返却値は作成したノードのアドレス。
int FreeNodeList(NODE *node);
 ノードのために確保した領域をすべて開放する。
 返却値は解放したノード数
void FreeNode(NODE *node);
 指定したノードのために確保した領域を開放する。
int PrintNodeList(NODE *node);
 ノードのデータを表示する。
 返却値は表示したデータの個数
NODE *ReverseNodeList(NODE **head);
 ノードの連結順を逆にする。
 返却値は先頭のノードのアドレス

プログラムは単方向リストを利用して複数行のデータを格納していくものです。
単方向リストについては、次のページでも解説しています。
http://masudahp.web.fc2.com/cl/calgo/list02.html
領域確保については、使っている関数がmallocですが次のページで解説しています。
http://masudahp.web.fc2.com/cl/calgo/list01.html

NODE型の変数は、[データの先頭アドレス,次のノードのアドレス]の2つのデータを
格納します。
例えば、abcd,efg,hijの3行分のデータを格納してみる。
head     ノード
100番地   100番地[abcd, NULL]
120番地   120番地[efg, 100番地] 100番地[abcd, NULL]
140番地   140番地[hij, 120番地] 120番地[efg, 100番地] 100番地[abcd, NULL]
となる。PrintNodeList(head)で表示すると
hij, efg, abcd と表示される。
ReverseNodeList(&head)で
100番地   140番地[hij, NULL] 120番地[efg, 140番地] 100番地[abcd, 120番地]
となる。

説明(手がかり)が少ないかもしれませんが、トレースしてみてください。
「ボトムアップ」、あります。yahooの辞書で調べられます。
それでは、またいつでもどうぞ。



CASLUおしえてください。。  りん - 2007/12/19(Wed) 02:10 No.210

下記のプログラムはresultのところに、九九の表のデータが入っていて、 
掛け算を加算と減算で行っていることはわかるのですが、 
具体的にどのように演算しているのか、その方法がわかりません。 

また、GRの各レジスタが果たす役割と 
ラベルTBLに格納される値の説明 

加えて、このプログラムと同じ結果になる他の演算方法、 
たとえば足し算を使う(?)方法などをおしえてください。 

お願いします!! 


PGM START 
 LD GR6, =0 
 INIT1 LD GR1, =1 
LOOP1 CPA GR1, LIMIT1 
JPL OUT1 
LD GR7, =0 
LAD GR3, 0, GR1 
PLACE ST GR3, TBL, GR7 
SLL GR3, 1 
LAD GR7, 1, GR7 
CPA GR7, LIMIT3 
JMI PLACE 
INIT2 LD GR2, =1 
LOOP2 CPA GR2, LIMIT2 
JPL OUT2 
LD GR0, =0 
LD GR7, =0 
LAD GR3, 0, GR2 
CALC SRL GR3, 1 
JOV SUM 
JUMP OUT 
SUM ADDA GR0, TBL, GR7 
OUT LAD GR7, 1, GR7 
XOR GR3, =0 
JNZ CALC 
ST GR0, RESULT, GR6 
LAD GR6, 1, GR6 
NEXT2 LAD GR2, 1, GR2 
JUMP LOOP2 
OUT2 NOP 
NEXT1 LAD GR1, 1, GR1 
JUMP LOOP1 
OUT1 RET 
LIMIT1 DC 9 
LIMIT2 DC 9 
LIMIT3 DC 4 
TBL DS 4 
RESULT DS 81 
END



Re: CASLUおしえてく...  hiroshi - 2007/12/19(Wed) 04:52 No.211

ようこそ、りん さん

> 具体的にどのように演算しているのか、
> GRの各レジスタが果たす役割と
> ラベルTBLに格納される値の説明
すべては、トレースしてみればわかります。
ここで説明(トレース)するのは大変なので、次のページをご覧下さい。
http://masudahp.web.fc2.com/casl2/casl2999.html

> 他の演算方法
九九はかけ算と同じことですから、次のページを参考にしてみて下さい。
http://masudahp.web.fc2.com/casl2/casl2210.html

それでは、またいつでもどうぞ。

ありがとうございます!!  りん - 2007/12/19(Wed) 18:00 No.212

hiroshiさん、かなり丁寧な説明ありがとうございました。

今、C言語とCASLUに行き詰ってて。。
ほんとうに助かりました。

また近いうちにお世話になってしまうと思うのですが。。苦笑

よろしくお願いします。

NO.210の関連  りん - 2007/12/20(Thu) 14:19 No.213

NO.210で質問させていただいたものですが、
そのときのCASLの問題をC言語に変えるとどのようになりますか??

単に、
#include <stdio.h>
main()
{
int i,j;
printf(" 1 2 3 4 5 6 7 8 9\n");
for(i=1; i<=9; i++){
printf("\n%3d",i);
for(j=1; j<=9; j++){
printf("%3d",i*j);
}
}
}

といった九九の表をつくるといったソースしかわからなくて。。

これじゃぁないですよね??苦笑

助けてください、、お願いします!!

Re: CASLUおしえてく...  hiroshi - 2007/12/22(Sat) 13:00 No.214

ようこそ、りん さん

上記のリストでいいと思いますよ。
しかし、それでは余りなので、また、次のページに作ってみました。
http://masudahp.web.fc2.com/casl2/casl2999.html
効率が悪くなるだけで、いいとは思いませんが。

それでは、またいつでもどうぞ。


はじめまして、よろしくおねがいします。  >X_SEED - 2007/10/19(Fri) 21:09 No.187

C言語にあるヘッダファイルの中身をについて調べたいのですが、コンパイラの本を購入すればいいのでしょうか?まだ、勉強し始めて長くはないのですが、気になるので質問してみました。理解できたら、自分でヘッダファイル(もちろん別名で保存して)を修正して実行ファイルのサイズの削減にもつながると思っているのですが。

Re: はじめまして、よろし...  hiroshi - 2007/10/20(Sat) 06:06 No.188

ようこそ、X_SEED さん
ヘッダファイルには、関数や定数の定義、マクロなどが書かれていて、修正しても
実行ファイルのサイズに大きな影響はないと思います。
一般的にヘッダファイルは、C言語をインストールするとincludeというフォルダにあります。
includeまたは*.hで検索してみてください。
実行ファイルは、コンパイラがオブジェクトファイルを作成し、リンカがこのファイルと
あらかじめ用意されているオブジェクトファイルとをリンクして実行ファイルを作成します。サイズについてはコンパイラがどのようなオブジェクトを作成するか、また、用意
されているオブジェクトのサイズが影響します。
サイズを小さくするには無駄のないソース(プログラム)を書くのが一番だと思います。
それでは、またいつでもどうぞ。

Re: はじめまして、よろし...  X_SEED - 2007/10/20(Sat) 20:30 No.189

わかりました。ありがとうございます。ちなみにハンドルネームは本名ですか?僕もヒロシなんですけど。

Re: はじめまして、よろし...  hiroshi - 2007/10/21(Sun) 01:45 No.190

そうです。

初めまして HSPの質問です  ennki - 2007/10/07(Sun) 22:36 No.185

 初めまして,ennkiといいます。
 さっそくですが,自分は今HSPでシューティングゲームを作っていて,このサイトの講座を参考にして作っているのですが,ふと,時間制限をつけたいと思ってきました。
 と,いうことで,時間制限をつけるにはどんなタグをどこに差し込めばいいですか?
 (ソースはここのシューティングゲームの講座の物とほぼ一緒,と考えてくれれば結構です)

Re: 初めまして HSPの質・..  hiroshi - 2007/10/08(Mon) 04:16 No.186

ようこそ、ennkiさん
時間制限はゲームを開始してからの時間が設定した時間になったら終了(ゲームオーバー)
ということですね。経過時間を取得する関数として次のページにテキストがあります。
一度、参考にしてみて下さい。
http://masudahp.web.fc2.com/hsp30/kiso/hspk031.html#h5
それではまたいつでもどうぞ。



VB6の質問です.  osa - 2007/10/02(Tue) 14:00 No.183

テキストエディタなどの「元に戻す」を行いたいのですが,
よくわかりません.

調べたところ,テンポラリファイルを使用することによって
出来るようなのですが,現在自分では出来ません.

よろしくお願いします.

Re: VB6の質問です.  hiroshi - 2007/10/03(Wed) 05:51 No.184

ようこそ、osaさん
入力操作するごとに、以前のデータをどこかに保存しておけば元に戻せることは
わかりますよね。
以前のデータをファイルに保存するのも一つの手段です。ディスクの容量だけ以前の
データを保存しておくことができますが、ディスクにアクセスすると処理速度に問題が
出るかもしれません。
そこで、変数(配列)に保存しておく方法を次に示します。もっとスマートにプログラミングできるかもしれませんが、とりあえずアイデア程度ということで。
以前のデータは丸ごと配列undodataに保存します。元に戻す処理はボタン(command1)で
行うことにします。

dim undodata(10) as string
private sub Text1_Change()
 for n=8 to 0 step -1   '9←8,8←7,7←6,…,1←0
  undodata(n+1) = undodata(n)
 next n
 undodata(0) = text1.text
End Sub

private sub Command1_button()
 text1.text = undodata(1)
 for n=0 to 8  '0←1,1←2,2←3,…,8←9
  undodata(n)=undodata(n+1)
 next n
end sub

以上です。
試してみてください。それではまた。


VB6の質問です.  osa - 2007/09/19(Wed) 13:29 No.176

ファイルの内容のコピーについてです.

テキストファイルを用意します.
そしてフォーム上にテキストボックスとコマンドボタンを
設置します.

行いたいことは,コマンドボタンをクリックしたときに
テキストファイルのすべての内容をコピーして
テキストボックスに表示することです.

扱おうとしているファイルが1000行前後と行数が一定では
なく,自分ではできませんでした.

質問がわかりにくいなどあったら言って下さい.
お願いします.

Re: VB6の質問です.  hiroshi - 2007/09/19(Wed) 20:33 No.177

ようこそ、osaさん
次のような形でどうでしょうか。
テキストファイルを用意します.-> textfile.txt とします。
テキストボックス -> text1、コマンドボタン -> command1 とします。

private sub Command1_click()
  open "textfile.txt" for input as #1 'ファイルを開く
  do
    if eof(1) then exit do
    input #1, d$   '1行読み込み(d$=文字型)
    text1.text = text1.text + d$ + vbCrLf  'データ連結
  loop
  close #1  'ファイルを閉じる
end sub

とくに行数に関係なくtextオブジェクトに表示できると思います。Textオブジェクト自体に容量の制限はあると思いますが。
textオブジェクトは複数行が扱えるようにプロパティの設定が必要です。
以上で試してみてください。考えていることと違うようなら、また質問してください。
それではまた。

Re: VB6の質問です.  hiroshi - 2007/09/19(Wed) 20:39 No.178

追加です。テキストファイルの1行の中にカンマ","があると正しく処理できません。Input命令はカンマまでを一つのデータ
として読み込むためです。そのような場合は、次のように変更してください。
input #1, d$ -> line input #1, D$

vbCrLfは改行文字を表す定数です。
次のテキストエディタ制作のページに同じような処理があります。よろしければご覧下さい。
http://masudahp.web.fc2.com/vb6/vb6first/texteditor0303.html
以上、追加でした。

ご返答ありがとうございました.  osa - 2007/09/20(Thu) 11:43 No.179

教えていただいた方法を用いることによって
テキストファイルの内容をコピーすることが出来ました.

しかしファイルの最後の方の内容は途中で切れてしまいました.扱いたいテキストファイルは勘違いで1000行ではなくて3000行ぐらいのファイルでした.
これはテキストボックスの容量の影響ですか?
最後まで表示させることは可能ですか?

また今後の参考にしたいと思いますので,テキストボックスの容量とはどのくらいなのか教えてください.

お願いします.


Re: VB6の質問です.  hiroshi - 2007/09/21(Fri) 21:21 No.180

できて良かったです。
さて、テキストボックスの容量ですが、ヘルプファイルを次に引用します。("Textプロパティ" で調べました。)

テキストボックス(TextBox)コントロールのTextプロパティに設定する文字列は、MultiLineプロパティが真(True)の場合は
最大で約32KBまで、偽(False)の場合は最大で2,048文字(半角の場合)までに、それぞれ制限されています。

それでは、またどうぞ。


connect関数で”No route to host”というエラーが発生する。  テテ - 2007/08/29(Wed) 15:28 No.169

ソケットプログラムの練習をしています。

サーバープラグラムが起動していない端末でクライアントプログラムを実行すると、connect関数で”No route to host”というエラーが発生します。

pingは通っていますし、IPやPORT番号に間違いはありません。
エラーの内容が、”No route to host”だとホストまで届いてない
ことになるのでしょうか?
基本的なことですいませんが、エラーの原因を教えてください。

addr.sin_family = AF_INET;
addr.sin_addr.s_addr = inet_addr("10.20.XX.XX");
addr.sin_port = htons(PORT);
if (connect(fd_socket, (struct sockaddr *) &addr,
sizeof(addr)) == -1) {
perror("client: connect");
return 1;

Re: connect関数で”No ro...  hiroshi - 2007/08/31(Fri) 11:27 No.171

ようこそ、テテさん
コンピュータ同士が通信をするとき、IPアドレスでお互いのコンピュータを特定します。例えば、A,Bの2つのコンピュータ
それぞれでソフト1とソフト2が動作しており、ソフト1同士が通信をする、また、ソフト2同士が通信するとします。
Aのソフト1からBにデータを送信したとき、データはIPアドレスでBには到着できますが、Bで動作している2つのソフトの
どちらが受信して良いのかわからない状態になります。この区別をするのにポート番号が使われます。
つまり、接続するには相手方、この場合はサーバプログラムも動作している必要があるのでは、と考えます。
例えば、プロバイダがメンテナンスなどでサーバプログラムを停止している間は閲覧ができない、と同じような状態と考えて良いと思います。
それでは、またいつでもどうぞ。



アルゴリズムのご相談  saint - 2007/08/23(Thu) 12:04 No.166

DHCPのような動作をするアルゴリズムを考えている最中なのですが…
その案の中でどうしてもクリア出来ない課題があります。

「配列で作られたテーブルにユーザ名の一覧があり、
そのユーザ名をキーワードとして配列のインデックスを抽出したい」

というもので、これだけなら簡単なのですが、以下3つの条件の提示により、無理ではないかと思えて仕方がないです。
・ユーザ名は何らかのルールに則って作られた文字列ではない。
・キーワードを頭から順に比較して探していく方法を使ってはいけない。
・ユーザの追加・削除がある度にソートし直さなければならないような構造にしてはいけない。

2分探索法などの検索回数を減らす方法はソートされてることが前提条件ですし、
ユーザ名から配列のインデックスに使える数値に変換できるような都合のいい関数なんて存在しないように思えるのですが、いかがでしょう?

ちなみに開発言語はCです。

Re: アルゴリズムのご相談  hiroshi - 2007/08/24(Fri) 07:57 No.167

ようこそ、saintさん
任意の文字列(ここではユーザ名)を数値に変換するには、文字コードを何らかの方法で計算すればいいと思います。
例えば、"ABC"を1文字ずつコードにすると65,66,67ですから、単純に加算すると198となります。すなわち、"ABC"を198に
変換できたことになります。ただし、"CBA"も同じ198になりますので、工夫が必要です。
このように、文字コードとして計算してインデックスを作成して配列に登録していく方法として「ハッシュ法」があります。
次のページに解説したページがありますので参考にしてみて下さい。
http://masudahp.web.fc2.com/cl/calgo/hash01.html
それでは、またいつでもどうぞ。


char型配列の宣言直後の値は?NULLがありえる?  C言語 - 2007/07/30(Mon) 15:33 No.161

以下のCプログラムで、関数NULLTESTを呼んだときにifに引っかかる場合(B==NULLの場合)
というのは起こりえるのでしょうか?  
このPGで宣言したchar配列の初期化をしない限り、値は不明とすると、 
NULLとして判定されることもあるということでしょうか?



char B_test[10+1]; 
char A_test[14+1]; 

int main(argv[] ){
int gbsRet=0;

★ ここで、A_testに文字列"20070720000000"を代入
★その後、以下の処理
gbcRet =NULLTEST(A_test,B_test);
if(gbcRet != 0)
{
printf("エラー",B_test);
}
}


int NULLTEST(char* A, char* B)
{
/*Null ,スペースチェックをする*/
if(A == NULL || B == NULL )
{
printf("引数NULL \n");
return -1;
}
return 0;
}

Re: char型配列の宣言直後...  hiroshi - 2007/08/04(Sat) 06:39 No.162

ようこそ、C言語 さん
大変遅くなりましたが・・・
おっしゃる通り、宣言した変数の値は不定(不明)です。
実行したときに変数の場所がメモリ上に確保されますが、どこに確保されるかわかりませんので、確保される場所によっては
値として0(NULL)が入っている可能性もあります。
従って、B==NULLでif文に引っかかることもあり得ます。
ということで、またいつでもどうぞ。



悩んでます・・  kyua - 2007/06/23(Sat) 10:41 No.158

はじめまして

現在 VB6 でメモ帳みたいなものを作っています。
その中にフォントサイズを任意に変更できるという機能をつけたいです。
そこで、 ConboBox のなかに数字(文字列)を入れ、それを数値に変換してフォントサイズに指定する形にしたかったのですがどうしてもエラーが出てしまいます。
原因がわからないのでご指南いただけないでしょうか?

以下が私が作ったものです。長々とすみません・・

Private Sub FontSizeToolStripComboBox1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles FontSizeToolStripComboBox1.Click

With FontSizeToolStripComboBox1.Items

.Add("8")
.Add("9")
.Add("10")
.Add("11")
.Add("12")
.Add("14")
.Add("16")
.Add("18")
.Add("20")
.Add("22")
.Add("24")
.Add("26")
.Add("28")
.Add("36")
.Add("48")
.Add("72")

End With

Dim SelectNo As ToolStripComboBox = FontSizeToolStripComboBox1

For Each SelectNo In SelectNo.SelectedItem

'数字を数値に変換
Dim FontNumber As Byte
FontNumber = Byte.Parse(SelectNo.Text)

'フォントサイズ指定
RichTextBox1.Font = New Font("", FontNumber)

Next

End Sub

Re: 悩んでます・・  hiroshi - 2007/06/24(Sun) 02:38 No.159

ようこそ、kyua さん
私のサイトにリッチテキストを扱ったぺーじがありますので、
一度ご覧下さい。

http://masudahp.web.fc2.com/vb6/vb6appl/richtexttest03.htm

また、いつでもどうぞ。

Re: 悩んでます・・  kyua - 2007/06/28(Thu) 21:12 No.160

ご返答ありがとうございました!
無事解決することができました。

今後もわからない部分があったら質問に来るかもしれませんのでそのときはまたよろしくお願いします!

質問です.Pictureboxに表示させた数字をマウスで選択  osa - 2007/05/22(Tue) 16:27 No.155

PrintメソッドでPictureboxに表示させた数字を
マウスで選択できるようにすることは可能ですか?

変な質問ですいません.
可能でしたら教えてください.
お願いします.

Re: 質問です.  hiroshi - 2007/05/23(Wed) 00:14 No.156

ようこそ、osaさん
できますよ。クリックした数字をテキストボックスに表示してみます。次のようにします。
フォームにピクチャボックス1つと確認用にテキストボックスを2つ配置します。それぞれ、Picture1, Text1, Text2と
します。プログラムは次の通りです。(注)インデントは全角空白です。

Private Sub Form_Load()
  Me.Show
  Picture1.AutoRedraw = True
  Picture1.ScaleMode = vbPoints  '座標系の単位(ポイント)
  Picture1.Font.Size = 16  'フォントサイズ(任意)
  Picture1.Font.Name = "MS ゴシック"  '固定幅のフォント
  Picture1.Print "01234"  '半角数字表示
  Picture1.Print "56789"
  Picture1.Line (0, 16)-(100, 16)  '枠描画
  Picture1.Line (16, 0)-(16, 100)
End Sub

Private Sub Picture1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
  Text1.Text = "X=" & X & " Y=" & Y  '座標表示
  If X < 40 And Y < 32 Then
    a = Int(X / 8) + Int(Y / 16) * 5  '選択数字計算
    Text2.Text = Str(a)  '選択数字表示
  End If
End Sub

Picture1のプロパティ設定はデザイン時にして構いません。
座標系の単位をフォントサイズの指定と同じ「ポイント」にしたので、計算が楽になっています。
Text1はクリックしたときの座標で確認用なので必要ありません。また、2本の直線も確認用なので必要ありません。
あとはリストをご覧下さい。
また、いつでもどうぞ。

ありがとうございます.  osa - 2007/05/23(Wed) 16:23 No.157

こちらを参考にしてやってみたいと思います.
また質問することがあると思いますので
そのときはお願いします.

過去ログ
メニューに戻る




inserted by FC2 system