追加質問のようですが、すっきりしないので質問します。

http://oshiete1.goo.ne.jp/kotaeru.php3?q=31299で、free()を行った後でもメモリーにアクセスできるというのは、どういう事でしょうか?

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

A 回答 (3件)

プログラムを実行するときには、同時に裏でこっそりメモリ管理屋さんも働いています。


その管理屋さんに、
メモリをこれだけ頂戴といういうのがmalloc()、
もういらないよというのがfree()です。

さて、そのメモリ管理屋さんは言葉どおり、
メモリを管理すること「だけ」しかしてくれません。
mallocされた領域はどこからどこまでというのを記憶しておく「だけ」です。
例えて言うなら、「この荷物みていて」といって頼んでおいたのに、
盗まれてしまったときに盗まれるの「見ていた」よという意味の見るだけ。に近いかも。

つまり、主プログラムがポインタを使って特定のメモリを読み書きすることと、
メモリ管理屋さんとはまったく関係がありません。
だからfree()をしても、freeされたことは覚えてるけど、
そこがそのあとどう使われようと関知しないんです。

ここで主プログラムとしてはどうすればよいのでしょう。
……自分でもメモリを管理する必要があるってことです。
そのためにやることは次の2点です。
・mallocしたメモリのポインタは保存しておく。
・必要なくなったらfreeして、同時に必ずそのポインタもNULLにしておく。
これを守らないとメモリリークで無駄にリソースが減っていったり、
別の用途で確保したメモリ領域を書き換えちゃったり、
バグの温床になりますので、気をつけたいですね。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。OSによって処理が違うということですね。これからもっと勉強していきます。ありがとうございました。

お礼日時:2001/01/26 00:32

y_okuさんの回答のとおりです



free()した後はOSが、他のプロセスによりそのメモリ領域が確保されない限りは
データはそのまま残りますし、アクセスしても読込・書込み共に出来てしまいます。
ただし、他のプログラムがその領域を確保した場合(OSが他のプログラムに割り振った場合)アクセスしようとすると、coredumpしてしまいます。

UNIXのように複数のプログラムが同時に動作する場合、当然、free()した後にそのメモリにアクセスする事は大変危険です。
当然、行ってはいけません。
しかし、そのことが原因で毎回coredumpするわけではありません。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。OSによって処理が違うということですね。これからもっと勉強していきます。ありがとうございました。

お礼日時:2001/01/26 00:33

そもそも、malloc関数は動的にメモリの空き領域を


確保する機能です。
また、使いおえた後はfreeで開放します。

DOSやWindowsはメモリ管理が非常にルーズなので
適当なプログラムを書いても動作している様に
見えるだけです。

理由としては、WindowsがSingle UserのOSだからです。
UNIXみたいなMulti UserのOSだと自分以外の人も
同じCPUを使用しているため、自分が使うためのメモリ
を確保しておく必要があります。

基本的に全てのメモリ領域の所有者はOSであり、OSは
各ユーザからメモリ確保要求が来たら、自分が管理
している領域の一部をユーザに貸し与えるのです。
したがって、ユーザから開放されたメモリ領域は
OSが所有者になります。
自分が確保したメモリ領域は他人からはアクセス
出来ない様になっています。

したがって、一度開放したメモリ領域は、他人に
使われている可能性があるわけです。
他人に使われていなくても、OSという他人が
所有者なのでアクセスできません。

言ってみれば、領海侵犯な訳です。

Windows9x,Meは空きメモリは所有者はいませんので
誰でも好き勝手に書き込めます。
特に VC++だと、、、

だから動作するのです。

WinNT,2kだともう少しまともになっていて、
空きメモリはの所有者はSYSTEMになっています。
そのため一般ユーザの勝手なアクセスは
できないはずです。

んでもって、この辺がNT,2kが安定している由縁なのです。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。OSによって処理が違うということですね。これからもっと勉強していきます。ありがとうございました。

お礼日時:2001/01/26 00:30

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

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

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

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

QC言語のソースコードの書き方

C言語のソースコードの書き方に関する質問です。
0を5個と1を4個の、合わせて9個の数字を並べて出来上がる数列のパターン(126通り)を全て羅列させるプログラムを作りたいと考えていますが、そのためにどういった方針を立ててソースコードを書けばよいかが分かりません。
どういった構造かだけでも構いませんので、教えて頂けると幸いです。
よろしくお願いします。

Aベストアンサー

という方針で書くとこんな感じね。
#include <stdio.h>

void
print_pattern(char pattern[], int size)
{
for (int i = 0; i < size; i++) {
printf("%c", pattern[i]);
}
printf("\n");
}

void
iter(char pattern[], int end, int n, int m)
{
if (n == 0 && m == 0) {
print_pattern(pattern, end);
return;
}

if (n == 0) {
pattern[end] = 'b';
iter(pattern, end + 1, n, m - 1);
return;
}
if (m == 0) {
pattern[end] = 'a';
iter(pattern, end + 1, n - 1, m);
return;
}

pattern[end] = 'b';
iter(pattern, end + 1, n, m - 1);
pattern[end] = 'a';
iter(pattern, end + 1, n - 1, m);
}

int
main(void)
{
int m = 5, n = 4;
char pattern[m + n];
iter(pattern, 0, m, n);
return 0;
}

という方針で書くとこんな感じね。
#include <stdio.h>

void
print_pattern(char pattern[], int size)
{
for (int i = 0; i < size; i++) {
printf("%c", pattern[i]);
}
printf("\n");
}

void
iter(char pattern[], int end, int n, int m)
{
if (n == 0 && m == 0) {
print_pattern(pattern, end);
return;
}

if (n == 0) {
pattern[end] = 'b';
iter(pattern, end + 1,...続きを読む

Qいつもお世話になっております。http://oshiete.goo.n

いつもお世話になっております。http://oshiete.goo.ne.jp/qa/5836517.htmlで質問させているものです。

皆さんのアドバイスを頂き、2分探索法で郵便番号から住所を検索するプログラムが出来たのですが、
住所から郵便番号を2分探索法で出すプログラムも同じ方法でやろうとしましたが、比較対象が漢字の為、大きい・小さいの判断できずに上手くプログラムが出来ていません。

csvファイルは読みデータをひとつに繋げてあいうえお順にソートしました

プログラムを一部載せておきます(かなり省略済みですが…)
#define NAME ken_all_address.csv

int main(int argc,char *argv[])
{
struct tb line;
FILE *fp;
char buff[SIZE], string_buff[SIZE];
char *address,*ret;
int flag,linesu,linesu1,sum,count,up,up1,low,low1,center,center1;
int i,j;
long pos[FSIZE];

clock_t start,end;

start = clock();
//引数処理
if((fq=fopen(NAME1,"r")) == NULL){
printf("ファイル%sが開けません\n",NAME1);
return -1;
}

if((fp=fopen(NAME,"r")) == NULL){
printf("ファイル%sが開けません\n",NAME);
return -1;
}

flag = 0;
address = argv[1];

count=0;
sum=0;

if(atoi(address) == 0){
for(i=0; ;i++){
pos[i] = ftell(fq);
ret=fgets( buff, sizeof(buff), fp );

if(ret==NULL){
break;
}
}
linesu = i;

//printf("%d",linesu);

low=0;
up=linesu-1;

while(low <= up){
center=(up+low)/2;
fseek(fq,pos[center-1],SEEK_SET);
fgets( buff, sizeof(buff), fp );

strtok(buff,",\"");
strtok(NULL,",\"");
strcpy(line.now_num,strtok(NULL,",\""));
strtok(NULL,",\"");
strtok(NULL,",\"");
strtok(NULL,",\"");
strcpy(line.kanji1,strtok(NULL,",\""));
strcpy(line.kanji2,strtok(NULL,",\""));
strcpy(line.kanji3,strtok(NULL,",\""));

strcpy(string_buff,line.kanji1);
strcat(string_buff,line.kanji2);
strcat(string_buff,line.kanji3);

printf("%s %s %s\n",line.kanji1,line.kanji2,line.kanji3);

if(strcmp(string_buff,address)==0){
printf("〒%s \n",line.now_num);
flag=1;
}
if(strstr(string_buff,address) ==NULL){
low=center+1;
}
else{
up=center-1;
}
}
}
fclose(fp);

if(flag==0 && atoi(argv[1]) == 0){
printf("「%s」に該当する郵便番号はありませんでした\n",address);
}

if(flag==0 && atoi(argv[1]) != 0){
printf("「%s」に該当する住所はありませんでした\n",address);
}

end = clock();

printf("引数=%s\n",address);
printf("%.30f秒かかりました\n",(double)(end-start)/CLOCKS_PER_SEC);
printf("fgetsの実行回数=%d回\n",sum);
printf("比較回数=%d回\n",count);
printf("\n");

return 0;
}

いつもお世話になっております。http://oshiete.goo.ne.jp/qa/5836517.htmlで質問させているものです。

皆さんのアドバイスを頂き、2分探索法で郵便番号から住所を検索するプログラムが出来たのですが、
住所から郵便番号を2分探索法で出すプログラムも同じ方法でやろうとしましたが、比較対象が漢字の為、大きい・小さいの判断できずに上手くプログラムが出来ていません。

csvファイルは読みデータをひとつに繋げてあいうえお順にソートしました

プログラムを一部載せておきます(かなり省略済みですが…)
#de...続きを読む

Aベストアンサー

 strcmpの返り値は文字列を文字コードで比較しての大小関係です。
 ただし、漢字の文字コードは必ずしも「あいうえお順」じゃないので、そのままでは2分探索法では検索出来ないでしょう。

 この場合は普通はデータに「読み方」のフィールドを追加し、そこに住所をひらがな(あるいはカタカナ)で記載し、それを使って2分探索法で検索します。
 別のやり方としては、CSVファイルを「あいうえお順」ではなく「文字コード順」にソートしたものを使って検索する方法もあります。

QC言語のソースコードについて教えてください。

以下のソースコードを学習用C言語開発環境で行ったのですが、
『ファイル「C:/Users/ユーザー名/AppData/Local/EasyIDEC/project/タイトル/main.c」の
「41行目」で記述エラーを発見しました。
「,」を付け忘れています。』

という、コンパイルエラーが表示されました。
何度も見直したのですが、よくわかりません。

#include <stdio.h>

int main(int argc, char *argv[])
{
char answer ;
answer = 'n' ;

while(answer =='n')
{
int input ;
input = 0 ;
int add ;
add = 1 ;
int sum ;
sum = 0 ;

printf("数値を入力して下さい。:") ;
scanf("%d", &input ) ;

int i ;
i = 0 ;

while(i < input)
{
sum =sum + add ;
printf("\n%d",sum) ;
i++ ;
add++ ;
}

printf("\n1から%dまでの総和は、%dです。" , input , sum) ;

while(1)
{

printf("\n終了しますか? y/n:") ;
scanf(" %c , &answer) ;

if( (answer != 'y') && (answer != 'n') )
{
printf( "y or nを入れてください。") ;
}
else
{
break ;
}
}
}
return 0 ;
}

以下のソースコードを学習用C言語開発環境で行ったのですが、
『ファイル「C:/Users/ユーザー名/AppData/Local/EasyIDEC/project/タイトル/main.c」の
「41行目」で記述エラーを発見しました。
「,」を付け忘れています。』

という、コンパイルエラーが表示されました。
何度も見直したのですが、よくわかりません。

#include <stdio.h>

int main(int argc, char *argv[])
{
char answer ;
answer = 'n' ;

while(answer =='n')
{
int input ;
input = 0 ;
int add ;
add = 1 ;
int sum ;
sum = 0 ;

printf("...続きを読む

Aベストアンサー

>>おかげで、エラー表記されずに、プログラムが実行されました。

これはコンパイルがうまく完了したってことでしょうか?できあがったプログラムが実行できたってことではないですよね?そうなら

>>’タイトル’は内部コマンドまたは外部コマンド、操作可能なプログラムまたはバッチ ファイルとして認識されていません。」

なんて問題は起きないはすですからね。

できあがったファイルは、XXXX.EXEのように拡張子のEXEがついていますか?もしXXXX.OBJであれば、リンクができていませんから、実行できません。

学習用C言語開発環境の使い方を確認してみてください。

P.S.
昔は、コンパイラを使うのは大変でしたが、今は楽ですね。CではなくPascal系コンパイラーですが、カセットテープに入っていて、コンパイラの読込にテープレコーダで15分かかったりとか、まあ大変だけど面白い時代でした。

Qhttp://www.geocities.jp/laprog321/

http://www.geocities.jp/laprog321/

この上記URLのプログラムについて質問です。

このプログラムはラプラス方程式を差分法で解くプログラムと書いていたので、
自分はまずプログラムを理解しようとするために、
インターネットなどで、ラプラス方程式の差分法による解き方についていろいろ調べて、式を考えたりしました。

そして、このプログラムがいう差分法とは中央差分方程式を用いて解いているのかなと思ったのですが、
何卒知識が少ないもので、実際に合ってるかどうかが分かりません。
また、ラプラス方程式をコンピュータに解かせる場合、解き方の反復法として、
いろいろな種類(ガウスザイデル法、ヤコビ法、SOR法など)の方法があることがわかりました。

ここで質問させていただきます。

プログラムでは、実際にどの方法を利用してどのように計算しているのか教えてほしいです。

例えば、ここの部分(行数など)で「~式」、「~法」を用いてどのように計算してるかなど教えてほしいです。

プログラムの流れについては、違う質問でご教授いただいたので、上記した質問のように
プログラム本文を使ってではなく、実際にこのプログラムでは、ラプラス方程式をどのような式を用いて、
また、どのような方法で解いているかを、矛盾しているようですが、プログラムと対比して教えていただきたいです。


同じような質問を繰り返し失礼いたします。
文章力のない質問で申し訳ありませんがよろしくお願いします。

http://www.geocities.jp/laprog321/

この上記URLのプログラムについて質問です。

このプログラムはラプラス方程式を差分法で解くプログラムと書いていたので、
自分はまずプログラムを理解しようとするために、
インターネットなどで、ラプラス方程式の差分法による解き方についていろいろ調べて、式を考えたりしました。

そして、このプログラムがいう差分法とは中央差分方程式を用いて解いているのかなと思ったのですが、
何卒知識が少ないもので、実際に合ってるかどうかが分かりません。
また、...続きを読む

Aベストアンサー

一般に、Ux(U の x による微分)を、『中心差分近似』すると、
Ux = (u(x+h / 2, y)-u(x-h / 2, y)) / h になり、これを用いて、
Uxx(U の x による2階偏微分)を『中心差分近似』すると、
Uxx = (Ux(x+h / 2, y)-Ux(x-h / 2, y)) / h
= (u(x+h / 2+h / 2 , y) / h-u(x+h / 2-h / 2, y) / h) / h (前半分)
- (u(x-h / 2+h / 2 , y) / h-u(x-h / 2-h / 2, y) / h) / h (後半分)

(前半分) = (u(x+h, y)-u(x, y)) / h^2
(後半分) = (u(x, y)-u(x-h, y)) / h^2
つまり、
Uxx = (u(x+h, y)-u(x, y)) / h^2-(u(x, y)-u(x-h, y)) / h^2
= (u(x+h, y)-2u(x, y)+u(x-h, y)) / h^2 となります。
同様に、
Uyy = (u(x, y+h)-2u(x, y)+u(x, y-h)) / h^2
これを、ラプラス方程式 Uxx+Uyy = 0 に代入して整理すると、

u(x+h, y)-2u(x, y)+u(x-h, y)+(u(x, y+h)-2u(x, y)+u(x, y-h) = 0
u(x+h, y)+u(x-h, y)+u(x, y+h)+u(x, y-h)-4u(x, y) = 0
u(x, y) = (u(x+h, y)+u(x-h, y)+u(x, y+h)+u(x, y-h))/4

h = 1 として、(さらに、x, y を i, j にして)配列で書き直せば、

u[i][j]=(u[i-1][j]+u[i+1][j]+u[i][j-1]+u[i][j+1])/4
各点におけるこの関係を満たすように、u を決定すればいいのですが、この連立方程式を解くのは手間なので、
u(new)[i][j]=(u(old)[i-1][j]+u(old)[i+1][j]+u(old)[i][j-1]+u(old)[i][j+1])/4
の計算を反復させることで近似値を得ます。

この反復計算は、すべての u(new) 算出に、u(old) を使っているので、ヤコビ法によるものになります。
プログラムの中も、これと、ほとんど同じ式なので、どこでやっているかは見当がつくかなと思います。

一般に、Ux(U の x による微分)を、『中心差分近似』すると、
Ux = (u(x+h / 2, y)-u(x-h / 2, y)) / h になり、これを用いて、
Uxx(U の x による2階偏微分)を『中心差分近似』すると、
Uxx = (Ux(x+h / 2, y)-Ux(x-h / 2, y)) / h
= (u(x+h / 2+h / 2 , y) / h-u(x+h / 2-h / 2, y) / h) / h (前半分)
- (u(x-h / 2+h / 2 , y) / h-u(x-h / 2-h / 2, y) / h) / h (後半分)

(前半分) = (u(x+h, y)-u(x, y)) / h^2
(後半分) = (u(x, y)-u(x-h, y)) / h^2
つまり、
Uxx = (u(x+h...続きを読む

QC言語ソースコードに関する質問です。

以下の数列について,初項から第15項までを求めるプログラムと実行結果を示せ。
0 1 1 2 3 5 8 13 21(ただし,初項=0,第1項=1とする。)

ソースコードを書くと、エラーがでた。
#include <stdio.h>
int fib(int n)
{
if(n==1 || n==2)
return 1;
else
return fib(n-1)+fib(n-2);
}
int main(void)
{
int n;
for(n=0;n<17;n++)
printf("%d,",fib(n));
}

正しソースコードを教えてください!

よろしくお願いします。

Aベストアンサー

#include <stdio.h>

void fib(int i, int j, int n)
{
if (n == 1)
{
printf("%d\n", i);
}
else
{
printf("%d\n", i);
return fib(j, i + j, n - 1);
}
}

int main(void)
{
fib(0, 1, 15);

return 0;
}

Qhttp://www.***.com/goo.htm(仮)

のページを見るために
#include <string>
#include <fstream>
using namespace std;

WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int)
{
ofstreamofs;
string html,file;

file="c:\\gomi.url";
ofs.open(file.c_str());
if(ofs.is_open())
{
html="[InternetShortcut]\n;
html+="URL=http://www.***.com/goo.htm\n";
ofs<<html;
ofs.close();
ShellExecute(NULL,"open",file.c_str(),NULL,NULL,SW_SHOWMAXIMIZED);
}
return 0;
}
としてgomi.urlにurlフォーマットのアドレスを書き込んでそれを開くことによってできますがもっと直接的にアプリで
http://www.***.com/goo.htm
を見る方法を教えてください

のページを見るために
#include <string>
#include <fstream>
using namespace std;

WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int)
{
ofstreamofs;
string html,file;

file="c:\\gomi.url";
ofs.open(file.c_str());
if(ofs.is_open())
{
html="[InternetShortcut]\n;
html+="URL=http://www.***.com/goo.htm\n";
ofs<<html;
ofs.close();
ShellExecute(NULL,"open",file.c_str(),NULL,NULL,SW_SHOWMAXIMIZED);
}
return 0;
}
としてgomi.urlにurlフォーマットのアドレスを書き込ん...続きを読む

Aベストアンサー

ShellExecute や CreateProcess で、ファイル名の代わりに URL を指定するとブラウザが開きます。

Qc言語のソースコードを教えて下さい

キーボードから10個の正整数値を読み込み,合計値を表示するプログラムを作りなさい。
ただし,キーボードから読み込んだ値はint型変数xにしまわれるものとし,変数はこのxと回数を数えるint型変数countと合計値をしまうint型変数sumのみを用いることとする。

このプログラムのソースコードを教えて下さい。
解説もよろしくお願いします。

Aベストアンサー

一例です。
添付のURLを参照して下さい。
因みに、平均値も算出しているが気にせずに、後はご自身で変数、コードを要調整して下さい。

参考URL:http://www.geocities.jp/kenji_y0328/crenshu/renshu/r021.gif

Qhttp://csharpimage.blog60.fc2.com/b

http://csharpimage.blog60.fc2.com/blog-entry-19.html
をみて、直線補間をC言語で記述したのですが、結果が思う様にいきません。(_____)
プログラムは以下です。間違っているのは、おそらく、座標を示すところだとはおもっているのですが、
そこをどうすればいいのか。。。。レベルが低くてごめんなさい(>_<
どなたかご教授願います。
FILE *fpt;
_wfopen_s(&fpt,Common_Data_Raw->filename,L"rb");
FILE *fpt_output;
int width=Common_Data_Raw->width;
int height=Common_Data_Raw->height;
// 拡大縮小後の画像サイズ
int hxSize=Common_Data_Raw->width_rescale;//拡大、縮小後の幅が入っている
int hySize=Common_Data_Raw->height_rescale;//拡大、縮小後の高さが入っている。
// 拡大縮小用
int xSize=width;
int ySize=height;
double xpos, ypos;
double hokanX = (double)(xSize - 1) / hxSize;
double hokanY = (double)(ySize - 1) / hySize;
int i,j;
unsigned char **layer,**bufdata,**rescale;
//メモリの確保→省略します。

if ((xSize < hxSize)&&(ySize<hySize))
{
// X方向の補間
for (i=0;i<ySize;i++)
{
xpos = 0.0;
for (j = 0; j < hxSize; j+=3)
{
bufdata[i][j] = (unsigned char)(((double)layer[i][(int)xpos + 1] - (double)layer[i][(int)xpos]) *(xpos - (int)xpos) +(double)layer[i][(int)xpos]);
bufdata[i][j+1] = (unsigned char)(((double)layer[i][(int)xpos + 1+1] - (double)layer[i][(int)xpos+1]) *(xpos - (int)xpos) +(double)layer[i][(int)xpos+1]);
bufdata[i][j+2] = (unsigned char)(((double)layer[i][(int)xpos + 1+2] - (double)layer[i][(int)xpos+2]) *(xpos - (int)xpos) +(double)layer[i][(int)xpos+2]);
xpos += hokanX;}
}

// Y方向の補間
for (i = 0; i < hxSize; i+=3)
{ypos = 0.0;for (j = 0; j <hySize; j++)
{rescale[j][i] = (unsigned char)(((double)bufdata[(int)ypos + 1][i] - (double)bufdata[(int)ypos][i]) *(ypos - (int)ypos) +
(double)bufdata[(int)ypos][i]);rescale[j][i+1] = (unsigned char)(((double)bufdata[(int)ypos + 1][i+1] - (double)bufdata[(int)ypos][i+1]) *(ypos - (int)ypos) + (double)bufdata[(int)ypos][i+1]);
rescale[j][i+2] = (unsigned char)(((double)bufdata[(int)ypos + 1][i+2] - (double)bufdata[(int)ypos][i+2]) * (ypos - (int)ypos) + (double)bufdata[(int)ypos][i+2]);
ypos += hokanY;}}
}
else
{
//rescaledata = SimpleRescaleImage(data, hxSize, hySize);

http://csharpimage.blog60.fc2.com/blog-entry-19.html
をみて、直線補間をC言語で記述したのですが、結果が思う様にいきません。(_____)
プログラムは以下です。間違っているのは、おそらく、座標を示すところだとはおもっているのですが、
そこをどうすればいいのか。。。。レベルが低くてごめんなさい(>_<
どなたかご教授願います。
FILE *fpt;
_wfopen_s(&fpt,Common_Data_Raw->filename,L"rb");
FILE *fpt_output;
int width=Common_Data_Raw->width;
int height=Common_Data_Raw->height;
// 拡大縮小...続きを読む

Aベストアンサー

xposの計算がデータ構造に合っていないのだと思われます。
一つの座標に対して、配列layerは3要素 (RGBでしょうか) を使っていますよね。たとえばlayer[i][12], layer[i][13], layer[i][14]で一組です。
xposとhokanXの計算はこのことを考慮していないように見えるので、xposの値が途中14.2になったりするとlayer[i][14], layer[i][15], layer[i][16]を組にしてアクセスします。これでは思うような結果が得られなくて当然です。
さらに、隣の座標をアクセスするのにlayer[i][(int)xpos+1+α]としている部分はlayer[i][(int)xpos+3+α]でなくてはいけないはずです。

データ構造を変えていいのであれば、layer[i][j], layer[i][j+1], layer[i][j+2]のような形ではなく、構造体の二重配列にしてlayer[i][j].r, layer[i][j].g, layer[i][j].bのようにアクセスすれば簡単になります。bufdataとrescaleも同様に。

xposの計算がデータ構造に合っていないのだと思われます。
一つの座標に対して、配列layerは3要素 (RGBでしょうか) を使っていますよね。たとえばlayer[i][12], layer[i][13], layer[i][14]で一組です。
xposとhokanXの計算はこのことを考慮していないように見えるので、xposの値が途中14.2になったりするとlayer[i][14], layer[i][15], layer[i][16]を組にしてアクセスします。これでは思うような結果が得られなくて当然です。
さらに、隣の座標をアクセスするのにlayer[i][(int)xpos+1+α]としている部分はlayer[...続きを読む

Qソースコードの間違い (C言語)

変数に、文字列を入れた配列の文字列の最後の要素数を入れたいのですが(つまり'\0')、うまくいきません。いつも2個多い値になってしまいます。

#include <stdio.h>

void main() {
char moji[100]={0};
int c=0;

fgets(moji,sizeof moji,stdin);

while( moji[c] != '\0' ) ++c;

printf("\n%d\n",c); //
}

例えば5文字の1ビット文字を入れると、最後の文字はmoji[4]にあるのでprintfで4と表示されるはずじゃないですか。でも6になるんです。いつも+2の値になるんですよ。どうやらfgetsを使っているからそうなるらしく、scanfを使うと結果は1多い値に、普通に配列に直接文字列を代入すると正常な結果になります。別にcに-2してもいいのですが、それはなんだか癪といいますか・・・。なぜこういうことがおきるのでしょうか?回答よろしくお願いします。

Aベストアンサー

>なぜこういうことがおきるのでしょうか
そのmoji[]の余計な部分にはどんなコードが入っているかは確認していますか?
リターンキーも「キー入力」の一つですよ。

Qネイティブ ハンドルって...............

ネイティブ ハンドルってなんでしょうか?
ウィンドウ ハンドルを調べていたら出てきたのですが
調べてもわかりません
すいませんがどのようなものなのかお教え願えませんか?
よろしくお願い致します

Aベストアンサー

カテゴリ違いでは?
.NETですよね。

.NETでは、従来のウィンドウハンドルは基本的に使いません。
Windowsプラットフォームにネイティブなものだからネイティブハンドルと呼んでいるのでしょう。


人気Q&Aランキング