5ちゃんねる ★スマホ版★ ■掲示板に戻る■ 全部 1- 最新50  

■ このスレッドは過去ログ倉庫に格納されています

C言語なら俺に聞け! Part 80

1 :ぼるじょあ ◆yBEncckFOU :04/05/17 08:19
まず問題を冷静に吟味してCの話か否かをはっきりさせてから質問しましょう。
質問する前には最低限検索を。

GUIなどの標準Cではできない事の質問は使用している開発環境のスレへGo! (←ここ注目)
ソース丸投げ、宿題、書籍 は専門の別スレがあるのでそこへさようなら。

エラー(警告含む)が起きたのならばエラーメッセージを書きましょう。

コンパイラを探しているなら >>2-13 を。
上記を逸した場合の結果は激しく未定義だYO!

C FAQ 日本語訳
http://www.kouno.jp/home/c_faq/
Cプログラマ必読 ・プログラミング言語C(通称 K&R)
http://www.amazon.co.jp/exec/obidos/ASIN/4320026926/

各種リンクは>>3-20あたり(誰か適当に貼って)

推奨NGワード: 「;-)」 「;)」 「ぼけ」 「頭悪すぎ」

C言語なら俺に聞け! Part 79
http://pc5.2ch.net/test/read.cgi/tech/1084138965/
他の過去ログはここに
http://nssearch.hp.infoseek.co.jp/clang/

952 :デフォルトの名無しさん:04/05/28 23:49
スレ一覧をgotoで検索するといい

953 :デフォルトの名無しさん:04/05/28 23:50
>>949
お前の書いたソース見なきゃ答えられない。

954 :デフォルトの名無しさん:04/05/28 23:51
>>950さん
では、この場合は使ってもいいということですか?

>>949さん
goto文を使うとプログラムが読みにくくなるそうです。
スパゲッティ プログラム goto
でググってみると色々見つかります。

955 :デフォルトの名無しさん:04/05/28 23:58
駄目だから環境によるんです。

956 :デフォルトの名無しさん:04/05/28 23:58
while(flag == 0){
  for(i=0;i<=7;i++){
        何らかの処理
        if(条件式==128){
           flag = 1;
         break;
        }
}
flagを使えばまあ一応書けるが。

957 :デフォルトの名無しさん:04/05/29 00:07
>>945
gotoを使って読みにくくなる規模であれば、関数にして 途中でreturnすればよい。
そう大きくなくとも、後々を考えて関数化しておくと都合が良い場合もあるだろう。
>>956のような手はお勧めしない。

958 :デフォルトの名無しさん:04/05/29 00:13
>>956さん>>957さん
ありがとうございました。
私個人としては、この場合のgotoは
スパゲッティにならないのでいいと思っていました。
>>956さんの方法もメモしておきます。
私のプログラムは全然大きくないので
とりあえず私の方式で行くことにします。

959 :デフォルトの名無しさん:04/05/29 00:51
>>956
for(i=0;;i=(i+1)&7){
 なんらかの処理
 if(条件式==128){
  break;
 }
}

こんなんでどうよ?


960 :デフォルトの名無しさん:04/05/29 01:00
関数に包んで return したくなるねぇ

961 :デフォルトの名無しさん:04/05/29 01:22
いくつかの構造体を引数に取るAPIのテストをしようと思ってます。
その構造体に読み込ませるテストデータをファイルで用意しといて、
再婚パイルしなくてすむようにしたいです。そういう場合、
例えば
struct T1 {
char str[10];
int a;
int b;
};
のような構造体に読み込ませるデータは
"Hello, world"
1
2
とか書いておいて順番にロードしていくような
イメージでいるんですが、何かもうちょっとうまい
方法ってありますかね?皆さんはこういう場合
どういう風にテストデータを読み込ませてますか?


962 :デフォルトの名無しさん:04/05/29 01:43
文字列に空白が無いなら

文字列 1 2
:
ってデータに汁かな

963 :デフォルトの名無しさん:04/05/29 02:03
先頭に保存数とかいれておいて読むときはループで回す。当然バイナリな。


964 :デフォルトの名無しさん:04/05/29 02:27
#include <stdio.h>

void StrnCpy(char *szDest, char *szSrc) {
szDest = (char*)malloc(strlen(szSrc)*sizeof(char));
strcpy(szDest, szSrc);
printf("StrnCpy内: %s\n", szDest);
}

int main(void) {
char *szPtr, *szSrc = "hoge";
StrnCpy(szPtr,szSrc);
printf("StrnCpy外: %s", szPtr);
return 0;
}

というようなコードを書いたんですが、出力はこうなります。
> StrnCpy内: hoge
> StrnCpy外: (null)
StrnCpy関数内部で割り当てたメモリは関数外部には持ち出せないようなのですが、これを回避するにはどうすれば
良いのでしょうか?ポインタを返すにはstaticとすると思いますが、この場合staticなローカル変数を宣言、初期化して
アドレスを第一引数(szDest)にコピーしても結果は変わりませんでした。どうか解決法をお願いします。

965 :デフォルトの名無しさん:04/05/29 02:30
ぽいんたのぽいんた

966 :964:04/05/29 02:32
少し訂正です。strlenは終端\0抜きの文字数を返すはずなので
szDest = (char*)malloc(strlen(szSrc)*sizeof(char)+1);
とする必要がありそうですね。あと、この場合はUnicode利用時に発生する
文字数←→バイト数問題は放置の方向でお願いします。

967 :デフォルトの名無しさん:04/05/29 02:36
>964 だからポインタのポインタ使えって

968 :964:04/05/29 02:36
>>965さん
ポインタのポインタを使って手抜き実装してみたところ見事にぬるぽで落ちたのでいろいろ調べてがんばってみます。
ありがとうございます。

969 :デフォルトの名無しさん:04/05/29 02:38
void StrnCpy(char **szDest, char *szSrc) {
*szDest = (char*)malloc(strlen(szSrc)*sizeof(char));
strcpy(*szDest, szSrc);
printf("StrnCpy内: %s\n", *szDest);
}

char *szPtr, *szSrc = "hoge";
StrnCpy(&szPtr,szSrc);


970 :964:04/05/29 03:00
うまく行きました。
http://black.sakura.ne.jp/~third/programming/c/c25.html
このあたりの解説を読んでコードを書いているうちに>>969さんの書き込みに気付いてちょっとカンニングしてしまいましたが。
Cに対する理解が深まった気がします。本当にありがとうございました。

971 :デフォルトの名無しさん:04/05/29 03:27
#include <stdio.h>

- void StrnCpy(char *szDest, char *szSrc)
+ char *StrnCpy(char *szDest, char *szSrc)
{
szDest = (char*)malloc(strlen(szSrc)*sizeof(char));
strcpy(szDest, szSrc);
printf("StrnCpy内: %s\n", szDest);
+ return szDest;
}

int main(void)
{
char *szPtr, *szSrc = "hoge";
- StrnCpy(szPtr,szSrc);
+ szPtr=StrnCpy(szPtr,szSrc);
printf("StrnCpy外: %s", szPtr);
return 0;
}



972 :デフォルトの名無しさん:04/05/29 05:03
以下のようなプログラムで、mapDataをポインタで返し
mainのmapを変更するとmapDataが変更されるようにしたいのですができません。
1次元配列ならできたのですが、2次元でのやり方を教えてください。

int *[5]GetMap(void)
{
static mapData[5][5];
return map;
}
int main(void)
{
int *map[5] = GetMap();
return 0;
}

973 :デフォルトの名無しさん:04/05/29 08:22
>>972
なんか凄いソースだな。

それはさておき、無理に高次元配列に拘らなくてもええやん。
1次元配列を使ってあとは自前でシミュレートすれば。


974 :デフォルトの名無しさん:04/05/29 08:29
typedef int (*m)[5];
m GetMap(void);

int (*map)[5]=GetMap();

975 :デフォルトの名無しさん:04/05/29 08:51
>>972

int (*GetMap(void))[5]
{
    static int mapData[5][5];
    
    return mapData;
}
int main(void)
{
    int (*map)[5] = GetMap();
    
    return map[0][0];
}


976 :デフォルトの名無しさん:04/05/29 09:05
>>945

int main(void)
{
    int i, j;
    
    for (j = 0; ; j++) {
        i = j & 7;
        何らかの処理;
        if(条件式 == 128){
            break;
        }
    }
}

128ならループの外で判断できそうだが。

977 :デフォルトの名無しさん:04/05/29 09:39
空白あけろ

978 :デフォルトの名無しさん:04/05/29 10:01
for (i = 0; なんらかの処理, 条件式 != 128; i = (i + 1) & 7) {
  ;

979 :ボブ:04/05/29 10:04
DSPの実験でスルー動作のプログラミングを作成したのですが
スルー動作とは解りやすくいうと何ですか?詳しく教えて下さい。
お願いします。

980 :デフォルトの名無しさん:04/05/29 10:09
さて次の話題

981 :972:04/05/29 10:50
ありがとうございます。

>>973
今まではそのやり方でやっていました。
1次元にして[y*MAP_SIZE_X+x]みたいな感じにして。

>>974>>975
どちらもできました。
まだ、この文法が分からないので、参考にさせてもらい勉強します。

982 :945:04/05/29 11:02
>>959さん>>976さん
ありがとうございます。
実行速度はn%8よりn&7のほうが速いのですね。
勉強になりました。
四則演算と同じ計算をビット演算で行える時は
ビット演算を使いたいと思います。
あと、なるべくgotoは使わずに
>>959さん>>976さんの方法を使ってみたいと思います。
それでは、しつれいします。

983 :デフォルトの名無しさん:04/05/29 11:14
まあgotoも使い方によっちゃ悪くない。同じ(パラメータのみ多少異なる)エラー処理をいくつも
書くのも、それだけのために他関数に飛ばしてソースを追いにくくするのも馬鹿らしい場合なんかには
積極的に使ってもいいんじゃないかと@Microsoft

984 :デフォルトの名無しさん:04/05/29 11:15
Cでgotoを使わない理由を考察するスレ goto loop3;
http://pc5.2ch.net/test/read.cgi/prog/1072018444/

985 :デフォルトの名無しさん:04/05/29 13:01
http://pc5.2ch.net/test/read.cgi/tech/1085465098/342-348

986 :デフォルトの名無しさん:04/05/29 13:11
ttp://www.sikaku.gr.jp/nj/index4.html
C言語プログラミング能力認定試験(3級)を受けようと
思っていますが、どのくらいの難しさでしょうか?
自分は「独習C」で勉強した程度です、アドバイスお願いします。

987 :デフォルトの名無しさん:04/05/29 13:24
>>986
俺が知っているものと同じなら、Cの歴史も勉強しておけ。

988 :986:04/05/29 13:28
>>986
アドバイスありがとうございます。
Cの歴史についての勉強も頑張ってみます。

989 :デフォルトの名無しさん:04/05/29 13:50
新スレ立ててくるぞおめーら。

990 :デフォルトの名無しさん:04/05/29 14:20
>989乙。

C言語なら俺に聞け! Part 81
http://pc5.2ch.net/test/read.cgi/tech/1085806791/

991 :デフォルトの名無しさん:04/05/29 15:15
質問です。
for(m_hoge=1;m_hoge<m_hoge2;m_hoge++)
のようにメンバ変数をforに入れるより
int hoge2=m_hoge2;
for(int i=1;i<hoge2;i++)
とした方が高速化するといわれ、実際にやってみたら高速化したんですが
これはどのような理由ででしょうか?
新たに変数を作ってコピー回数が増えて逆に遅くなるんじゃないか?と思ったのですが・・・

初歩的な質問ですみません。

992 :デフォルトの名無しさん:04/05/29 15:18
>>991
そのm_hogeというのは実際はa.m_hogeみたいな形か?
それなら比較するたびに構造体の中からメンバーを取り出す手間が省けるから速くなったんじゃないの?

993 :デフォルトの名無しさん:04/05/29 15:22
>>991
http://www.emit.jp/prog/prog_opt0.html
ここに同じような最適化の例がある。


994 :デフォルトの名無しさん:04/05/29 15:25
レジスタにおかれるかどうかってことか?

995 :デフォルトの名無しさん:04/05/29 15:28
アセンブルリストを見ろ。
---終了---

996 :デフォルトの名無しさん:04/05/29 15:33
>>995
氏ね

997 :デフォルトの名無しさん:04/05/29 16:05
>>991
コンパイラが賢ければどちらも同じになる。
メンバ変数ということはC++でスレ違いだが、コンパイラがforの内側の処理でそれが
変更される可能性があると思ってしまうと、毎回メモリアクセスになってしまう。

998 :デフォルトの名無しさん:04/05/29 16:11
999get

999 :デフォルトの名無しさん:04/05/29 16:12
999gets

1000 :デフォルトの名無しさん:04/05/29 16:12
1000

1001 :1001:Over 1000 Thread
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。

215 KB
★スマホ版★ 掲示板に戻る 全部 前100 次100 最新50

read.cgi ver 05.04.00 2017/10/04 Walang Kapalit ★
FOX ★ DSO(Dynamic Shared Object)